forked from loafle/openapi-generator-original
[Java] Unalias type when generating default value for model property (#5017)
Co-authored-by: Jim Schubert <james.schubert@gmail.com>
This commit is contained in:
parent
966b87e66c
commit
91ea6a17d9
@ -24,6 +24,7 @@ import io.swagger.v3.oas.models.PathItem;
|
|||||||
import io.swagger.v3.oas.models.media.ArraySchema;
|
import io.swagger.v3.oas.models.media.ArraySchema;
|
||||||
import io.swagger.v3.oas.models.media.ComposedSchema;
|
import io.swagger.v3.oas.models.media.ComposedSchema;
|
||||||
import io.swagger.v3.oas.models.media.Schema;
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
|
import io.swagger.v3.oas.models.media.StringSchema;
|
||||||
import io.swagger.v3.oas.models.servers.Server;
|
import io.swagger.v3.oas.models.servers.Server;
|
||||||
import io.swagger.v3.parser.util.SchemaTypeUtil;
|
import io.swagger.v3.parser.util.SchemaTypeUtil;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
@ -765,16 +766,23 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTypeDeclaration(Schema p) {
|
public String getTypeDeclaration(Schema p) {
|
||||||
if (ModelUtils.isArraySchema(p)) {
|
Schema<?> schema = ModelUtils.unaliasSchema(this.openAPI, p);
|
||||||
Schema<?> items = getSchemaItems((ArraySchema) p);
|
Schema<?> target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
|
||||||
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
|
if (ModelUtils.isArraySchema(target)) {
|
||||||
} else if (ModelUtils.isMapSchema(p) && !ModelUtils.isComposedSchema(p)) {
|
Schema<?> items = getSchemaItems((ArraySchema) schema);
|
||||||
|
return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">";
|
||||||
|
} else if (ModelUtils.isMapSchema(target)) {
|
||||||
// Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
|
// Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines
|
||||||
// additionalproperties: true
|
// additionalproperties: true
|
||||||
Schema<?> inner = getSchemaAdditionalProperties(p);
|
Schema<?> inner = getAdditionalProperties(target);
|
||||||
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
|
if (inner == null) {
|
||||||
|
LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", p.getName());
|
||||||
|
inner = new StringSchema().description("TODO default missing map inner type to string");
|
||||||
|
p.setAdditionalProperties(inner);
|
||||||
|
}
|
||||||
|
return getSchemaType(target) + "<String, " + getTypeDeclaration(inner) + ">";
|
||||||
}
|
}
|
||||||
return super.getTypeDeclaration(p);
|
return super.getTypeDeclaration(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -416,6 +416,34 @@ public class AbstractJavaCodegenTest {
|
|||||||
Schema<?> schema = createObjectSchemaWithMinItems();
|
Schema<?> schema = createObjectSchemaWithMinItems();
|
||||||
String defaultValue = codegen.toDefaultValue(schema);
|
String defaultValue = codegen.toDefaultValue(schema);
|
||||||
Assert.assertNull(defaultValue);
|
Assert.assertNull(defaultValue);
|
||||||
|
|
||||||
|
// Create an alias to an array schema
|
||||||
|
Schema<?> nestedArraySchema = new ArraySchema().items(new IntegerSchema().format("int32"));
|
||||||
|
codegen.setOpenAPI(new OpenAPI().components(new Components().addSchemas("NestedArray", nestedArraySchema)));
|
||||||
|
|
||||||
|
// Create an array schema with item type set to the array alias
|
||||||
|
schema = new ArraySchema().items(new Schema().$ref("#/components/schemas/NestedArray"));
|
||||||
|
|
||||||
|
ModelUtils.setGenerateAliasAsModel(false);
|
||||||
|
defaultValue = codegen.toDefaultValue(schema);
|
||||||
|
Assert.assertEquals(defaultValue, "new ArrayList<List<Integer>>()");
|
||||||
|
|
||||||
|
ModelUtils.setGenerateAliasAsModel(true);
|
||||||
|
defaultValue = codegen.toDefaultValue(schema);
|
||||||
|
Assert.assertEquals(defaultValue, "new ArrayList<NestedArray>()");
|
||||||
|
|
||||||
|
// Create a map schema with additionalProperties type set to array alias
|
||||||
|
schema = new MapSchema().additionalProperties(new Schema().$ref("#/components/schemas/NestedArray"));
|
||||||
|
|
||||||
|
ModelUtils.setGenerateAliasAsModel(false);
|
||||||
|
defaultValue = codegen.toDefaultValue(schema);
|
||||||
|
Assert.assertEquals(defaultValue, "new HashMap<String, List<Integer>>()");
|
||||||
|
|
||||||
|
ModelUtils.setGenerateAliasAsModel(true);
|
||||||
|
defaultValue = codegen.toDefaultValue(schema);
|
||||||
|
Assert.assertEquals(defaultValue, "new HashMap<String, NestedArray>()");
|
||||||
|
|
||||||
|
// Test default value for date format
|
||||||
DateSchema dateSchema = new DateSchema();
|
DateSchema dateSchema = new DateSchema();
|
||||||
LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
|
LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
|
||||||
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
||||||
|
@ -608,6 +608,7 @@ public class JavaClientCodegenTest {
|
|||||||
.setLibrary(JavaClientCodegen.RESTEASY)
|
.setLibrary(JavaClientCodegen.RESTEASY)
|
||||||
.setAdditionalProperties(properties)
|
.setAdditionalProperties(properties)
|
||||||
.setImportMappings(importMappings)
|
.setImportMappings(importMappings)
|
||||||
|
.setGenerateAliasAsModel(true)
|
||||||
.setInputSpec("src/test/resources/3_0/type-alias.yaml")
|
.setInputSpec("src/test/resources/3_0/type-alias.yaml")
|
||||||
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
|
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user