Skip to content

Commit d6fae51

Browse files
authored
Fix generating model with discriminator. (#1167)
Remove discriminator from required properties constructor. Fixed #1163 Fixed #1168
1 parent c82d466 commit d6fae51

File tree

3 files changed

+49
-11
lines changed

3 files changed

+49
-11
lines changed

openapi-generator/src/main/java/io/micronaut/openapi/generator/AbstractMicronautJavaCodegen.java

+35-3
Original file line numberDiff line numberDiff line change
@@ -786,14 +786,46 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
786786

787787
for (ModelsMap models : objs.values()) {
788788
CodegenModel model = models.getModels().get(0).getModel();
789-
if (model.getParentModel() != null) {
790-
model.vendorExtensions.put("requiredParentVars", model.getParentModel().requiredVars);
789+
790+
var hasParent = model.getParentModel() != null;
791+
var requiredVarsWithoutDiscriminator = new ArrayList<CodegenProperty>();
792+
for (var v : model.requiredVars) {
793+
boolean isDiscriminator = false;
794+
if (hasParent) {
795+
for (var pv : model.getParentModel().getAllVars()) {
796+
if (pv.required && pv.getName().equals(v.getName())) {
797+
isDiscriminator = pv.isDiscriminator;
798+
break;
799+
}
800+
}
801+
} else {
802+
isDiscriminator = v.isDiscriminator;
803+
}
804+
if (!isDiscriminator) {
805+
requiredVarsWithoutDiscriminator.add(v);
806+
}
807+
}
808+
809+
if (hasParent) {
810+
var parentRequiredVarsWithoutDiscriminator = new ArrayList<CodegenProperty>();
811+
for (var v : model.getParentModel().vars) {
812+
if (v.required && !v.isDiscriminator) {
813+
parentRequiredVarsWithoutDiscriminator.add(v);
814+
}
815+
}
816+
model.vendorExtensions.put("requiredParentVarsWithoutDiscriminator", parentRequiredVarsWithoutDiscriminator);
791817
model.parentVars = model.getParentModel().allVars;
792818
}
793819

794820
List<CodegenProperty> requiredVars = model.vars.stream().filter(v -> v.required).collect(Collectors.toList());
821+
822+
model.vendorExtensions.put("requiredVarsWithoutDiscriminator", requiredVarsWithoutDiscriminator);
795823
model.vendorExtensions.put("requiredVars", requiredVars);
796-
model.vendorExtensions.put("areRequiredVarsAndReadOnlyVars", !requiredVars.isEmpty() && !model.readOnlyVars.isEmpty());
824+
model.vendorExtensions.put("areRequiredVarsAndReadOnlyVars", !requiredVarsWithoutDiscriminator.isEmpty() && !model.readOnlyVars.isEmpty());
825+
if (model.discriminator != null) {
826+
model.vendorExtensions.put("hasMappedModels", !model.discriminator.getMappedModels().isEmpty());
827+
model.vendorExtensions.put("hasMultipleMappedModels", model.discriminator.getMappedModels().size() > 1);
828+
}
797829
}
798830

799831
return objs;

openapi-generator/src/main/resources/templates/java-micronaut/common/model/pojo.mustache

+4-3
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,17 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorE
113113
{{/vars}}
114114

115115
{{#requiredPropertiesInConstructor}}
116-
public {{classname}}({{#requiredVars}}{{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/requiredVars}}{{#vendorExtensions.areRequiredVarsAndReadOnlyVars}}, {{/vendorExtensions.areRequiredVarsAndReadOnlyVars}}{{#readOnlyVars}}{{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/readOnlyVars}}) {
116+
public {{classname}}({{#vendorExtensions.requiredVarsWithoutDiscriminator}}{{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/vendorExtensions.requiredVarsWithoutDiscriminator}}{{#vendorExtensions.areRequiredVarsAndReadOnlyVars}}, {{/vendorExtensions.areRequiredVarsAndReadOnlyVars}}{{#readOnlyVars}}{{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}{{/readOnlyVars}}) {
117117
{{#parent}}
118-
super({{#vendorExtensions.requiredParentVars}}{{name}}{{^-last}}, {{/-last}}{{/vendorExtensions.requiredParentVars}});
118+
super({{#vendorExtensions.requiredParentVarsWithoutDiscriminator}}{{name}}{{^-last}}, {{/-last}}{{/vendorExtensions.requiredParentVarsWithoutDiscriminator}});
119119
{{/parent}}
120120
{{#vendorExtensions.requiredVars}}
121+
{{^isDiscriminator}}
121122
this.{{name}} = {{name}};
123+
{{/isDiscriminator}}
122124
{{/vendorExtensions.requiredVars}}
123125
}
124126
{{/requiredPropertiesInConstructor}}
125-
126127
{{^requiredPropertiesInConstructor}}
127128
public {{classname}}() {
128129
{{#parent}}

openapi-generator/src/main/resources/templates/java-micronaut/common/model/typeInfoAnnotation.mustache

+10-5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@
33
value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
44
allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
55
)
6-
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}"{{^micronaut_serde_jackson}}, visible = true{{/micronaut_serde_jackson}})
6+
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "{{{discriminator.propertyBaseName}}}"{{^micronaut_serde_jackson}}, visible = true{{/micronaut_serde_jackson}})
77
{{#discriminator}}
8-
{{#mappedModels.0}}
9-
@JsonSubTypes({ {{#mappedModels}}
8+
{{#vendorExtensions.hasMappedModels}}
9+
{{#vendorExtensions.hasMultipleMappedModels}}
10+
@JsonSubTypes({{openbrace}}{{#mappedModels}}
1011
@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"){{^-last}},{{/-last}}
11-
{{/mappedModels}}{{closebarace}})
12-
{{/mappedModels.0}}
12+
{{/mappedModels}}{{closebrace}})
13+
{{/vendorExtensions.hasMultipleMappedModels}}
14+
{{^vendorExtensions.hasMultipleMappedModels}}
15+
@JsonSubTypes({{#mappedModels}}@JsonSubTypes.Type(value = {{modelName}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{mappingName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"){{/mappedModels}})
16+
{{/vendorExtensions.hasMultipleMappedModels}}
17+
{{/vendorExtensions.hasMappedModels}}
1318
{{/discriminator}}
1419
{{/jackson}}

0 commit comments

Comments
 (0)