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.ComposedSchema;
|
||||
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.parser.util.SchemaTypeUtil;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
@ -765,16 +766,23 @@ public abstract class AbstractJavaCodegen extends DefaultCodegen implements Code
|
||||
|
||||
@Override
|
||||
public String getTypeDeclaration(Schema p) {
|
||||
if (ModelUtils.isArraySchema(p)) {
|
||||
Schema<?> items = getSchemaItems((ArraySchema) p);
|
||||
return getSchemaType(p) + "<" + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, items)) + ">";
|
||||
} else if (ModelUtils.isMapSchema(p) && !ModelUtils.isComposedSchema(p)) {
|
||||
Schema<?> schema = ModelUtils.unaliasSchema(this.openAPI, p);
|
||||
Schema<?> target = ModelUtils.isGenerateAliasAsModel() ? p : schema;
|
||||
if (ModelUtils.isArraySchema(target)) {
|
||||
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
|
||||
// additionalproperties: true
|
||||
Schema<?> inner = getSchemaAdditionalProperties(p);
|
||||
return getSchemaType(p) + "<String, " + getTypeDeclaration(ModelUtils.unaliasSchema(this.openAPI, inner)) + ">";
|
||||
Schema<?> inner = getAdditionalProperties(target);
|
||||
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
|
||||
|
@ -416,6 +416,34 @@ public class AbstractJavaCodegenTest {
|
||||
Schema<?> schema = createObjectSchemaWithMinItems();
|
||||
String defaultValue = codegen.toDefaultValue(schema);
|
||||
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();
|
||||
LocalDate defaultLocalDate = LocalDate.of(2019,2,15);
|
||||
Date date = Date.from(defaultLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
|
||||
|
@ -608,6 +608,7 @@ public class JavaClientCodegenTest {
|
||||
.setLibrary(JavaClientCodegen.RESTEASY)
|
||||
.setAdditionalProperties(properties)
|
||||
.setImportMappings(importMappings)
|
||||
.setGenerateAliasAsModel(true)
|
||||
.setInputSpec("src/test/resources/3_0/type-alias.yaml")
|
||||
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user