diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java index f2f0ee97ca39dabcc0a3dbe609d44bf30381fe11..7c16b0ca74a655d640ea8400623590c6c4c0b437 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenModel.java @@ -75,6 +75,7 @@ public class CodegenModel implements IJsonSchemaValidationProperties { public Set<String> imports = new TreeSet<String>(); public boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; + public CodegenProperty parentContainer; /** * Indicates the OAS schema specifies "nullable: true". */ diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java index bc1101c015e99c68388761f34aa4a96ddc22cd7b..40d1fbcf9a5d8de8410aa2b33d6836627740c03e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenProperty.java @@ -154,6 +154,7 @@ public class CodegenProperty implements Cloneable, IJsonSchemaValidationProperti public List<String> _enum; public Map<String, Object> allowableValues; public CodegenProperty items; + public Integer itemsDepth; public CodegenProperty mostInnerItems; public Map<String, Object> vendorExtensions = new HashMap<String, Object>(); public boolean hasValidation; // true if pattern, maximum, etc are set (only used in the mustache template) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 6394f1ace4cba32af2ba44cafe0ab15bff71e773..c4d152e9159833af97fcb9a735660248786a42f6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2816,6 +2816,10 @@ public class DefaultCodegen implements CodegenConfig { * @return Codegen Property object */ public CodegenProperty fromProperty(String name, Schema p) { + return fromProperty(name, p, null); + } + + private CodegenProperty fromProperty(String name, Schema p, Integer itemsDepth) { if (p == null) { LOGGER.error("Undefined property/schema for `{}`. Default to type:string.", name); return null; @@ -2829,6 +2833,7 @@ public class DefaultCodegen implements CodegenConfig { ModelUtils.syncValidationProperties(p, property); + property.itemsDepth = itemsDepth; property.name = toVarName(name); property.baseName = name; if (p.getType() == null) { @@ -3070,7 +3075,11 @@ public class DefaultCodegen implements CodegenConfig { } ArraySchema arraySchema = (ArraySchema) p; Schema innerSchema = ModelUtils.unaliasSchema(this.openAPI, getSchemaItems(arraySchema), importMapping); - CodegenProperty cp = fromProperty(itemName, innerSchema); + if (arraySchema.getItems() == null) { + arraySchema.setItems(innerSchema); + } + CodegenProperty cp = fromProperty(itemName, innerSchema, + itemsDepth == null ? 1 : itemsDepth.intValue() + 1); updatePropertyForArray(property, cp); } else if (ModelUtils.isMapSchema(p)) { property.isContainer = true; @@ -3088,7 +3097,8 @@ public class DefaultCodegen implements CodegenConfig { innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); p.setAdditionalProperties(innerSchema); } - CodegenProperty cp = fromProperty("inner", innerSchema); + CodegenProperty cp = fromProperty("inner", innerSchema, + itemsDepth == null ? 1 : itemsDepth.intValue() + 1); updatePropertyForMap(property, cp); } else if (ModelUtils.isFreeFormObject(p)) { property.isFreeFormObject = true; @@ -4407,10 +4417,10 @@ public class DefaultCodegen implements CodegenConfig { } protected void addParentContainer(CodegenModel model, String name, Schema schema) { - final CodegenProperty property = fromProperty(name, schema); - addImport(model, property.complexType); + model.parentContainer = fromProperty(name, schema); + addImport(model, model.parentContainer.complexType); model.parent = toInstantiationType(schema); - final String containerType = property.containerType; + final String containerType = model.parentContainer.containerType; final String instantiationType = instantiationTypes.get(containerType); if (instantiationType != null) { addImport(model, instantiationType);