openapi-generator icon indicating copy to clipboard operation
openapi-generator copied to clipboard

[QUESTION][JAVA] How to generate inner static class by spec?

Open romanov93 opened this issue 11 months ago • 1 comments

I use jaxrs-cxf generator

    AAA:
      properties:
        someValue:
          type: string
    BBB:
      properties:
        someValue:
          type: string

Is it possible to make BBB is inner class into AAA ?

    public class AAA {
        protected String someValue;
        
        public static class BBB {
            protected String someValue;
        }
    }

maybe I need to change something in my pojo.mustache and use oneOf property?

romanov93 avatar Mar 05 '25 14:03 romanov93

maybe you can try this? config:

    AAA:
      properties:
        someValue:
          type: string
        BBB:
          type: object
          properties:
            someValue:
              type: string

add VendorExtensions

import org.openapitools.codegen.languages.JavaClientCodegen;
public class JavaCodegen extends JavaClientCodegen {

    @Override
    public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
        Map<String, ModelsMap> result = super.postProcessAllModels(objs);
        Set<String> removeKeys = new HashSet<>();
        for (ModelsMap mm : result.values()) {
            for (ModelMap mMap : mm.getModels()) {
                CodegenModel parent = mMap.getModel();
                //todo get children
                List<CodegenModel> subs =
                if (subs != null && !subs.isEmpty()) {
                    for (CodegenModel sub : subs) {
                        parent.imports.addAll(sub.imports);
                    }
                    parent.getVendorExtensions()
                            .put("x-children-model", subs);
                    subs.forEach(c -> removeKeys.add(c.getName()));
                }
            }
        }
        removeKeys.forEach(result::remove);
        return result;
    }

pojo.mustache

public class {{classname}}  {
    {{#vars}}
    private {{{datatypeWithEnum}}} {{name}};
    {{/vars}}

    public {{classname}}() {
    }

    {{#vars}}
    public {{{datatypeWithEnum}}} {{getter}}() {
        return {{name}};
    }

    public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
        this.{{name}} = {{name}};
    }
    {{/vars}}

    {{#vendorExtensions.x-children-model}}
    public static class {{classname}} {
        {{#vars}}
        private {{{datatypeWithEnum}}} {{name}};
        {{/vars}}

        public {{classname}}() {
        }

        {{#vars}}
        public {{{datatypeWithEnum}}} {{getter}}() {
            return {{name}};
        }

        public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
            this.{{name}} = {{name}};
        }
        {{/vars}}
    }

    {{/vendorExtensions.x-children-model}}
}

shuke-bit avatar Jun 12 '25 09:06 shuke-bit