Skip to content

Commit 3e150ea

Browse files
authored
[Java][jaxrs] support disableDiscriminatorJsonIgnoreProperties in typeInfoAnnotation (#24532)
* [jaxrs-spec] honor disableDiscriminatorJsonIgnoreProperties in typeInfoAnnotation * update samples
1 parent 849a332 commit 3e150ea

5 files changed

Lines changed: 74 additions & 3 deletions

File tree

modules/openapi-generator/src/main/resources/JavaJaxRS/spec/typeInfoAnnotation.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
{{#jackson}}
2+
{{^disableDiscriminatorJsonIgnoreProperties}}
23
@JsonIgnoreProperties(
34
value = "{{{discriminator.propertyBaseName}}}", // ignore manually set {{{discriminator.propertyBaseName}}}, it will be automatically generated by Jackson during serialization
45
allowSetters = true // allows the {{{discriminator.propertyBaseName}}} to be set during deserialization
56
)
67
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
8+
{{/disableDiscriminatorJsonIgnoreProperties}}
9+
{{#disableDiscriminatorJsonIgnoreProperties}}
10+
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "{{{discriminator.propertyBaseName}}}", visible = true)
11+
{{/disableDiscriminatorJsonIgnoreProperties}}
712
@JsonSubTypes({
813
{{#discriminator.mappedModels}}
914
@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}}"),

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.stream.Collectors;
3131

3232
import static org.openapitools.codegen.TestUtils.*;
33+
import static org.openapitools.codegen.languages.AbstractJavaCodegen.DISABLE_DISCRIMINATOR_JSON_IGNORE_PROPERTIES;
3334
import static org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen.*;
3435
import static org.openapitools.codegen.languages.features.GzipFeatures.USE_GZIP_FEATURE;
3536
import static org.testng.Assert.assertTrue;
@@ -1403,6 +1404,71 @@ public void testDiscriminatorJsonIgnorePropertiesPropagatesToChildren_whenLegacy
14031404
}
14041405
}
14051406

1407+
/**
1408+
* With {@code disableDiscriminatorJsonIgnoreProperties=false} (the default) the jaxrs-spec
1409+
* template emits {@code @JsonIgnoreProperties} on the discriminated model and uses
1410+
* {@code JsonTypeInfo.As.PROPERTY}. Regression guard mirroring the Java/Spring template behaviour.
1411+
*/
1412+
@Test
1413+
public void disableDiscriminatorJsonIgnorePropertiesIsFalseThenJsonIgnorePropertiesShouldBeAdded() throws Exception {
1414+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1415+
output.deleteOnExit();
1416+
1417+
Map<String, Object> properties = new HashMap<>();
1418+
properties.put("legacyDiscriminatorBehavior", "false");
1419+
properties.put(DISABLE_DISCRIMINATOR_JSON_IGNORE_PROPERTIES, "false");
1420+
1421+
final CodegenConfigurator configurator = new CodegenConfigurator()
1422+
.setGeneratorName("jaxrs-spec")
1423+
.setAdditionalProperties(properties)
1424+
.setInputSpec("src/test/resources/3_0/jaxrs-spec/discriminator-mapping-children.yaml")
1425+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
1426+
1427+
DefaultGenerator generator = new DefaultGenerator();
1428+
Map<String, File> files = generator.opts(configurator.toClientOptInput()).generate().stream()
1429+
.collect(Collectors.toMap(File::getName, Function.identity()));
1430+
1431+
JavaFileAssert.assertThat(files.get("PetResponse.java"))
1432+
.fileContains(
1433+
"@JsonIgnoreProperties(",
1434+
"value = \"petType\"",
1435+
"allowSetters = true",
1436+
"include = JsonTypeInfo.As.PROPERTY")
1437+
.fileDoesNotContain("include = JsonTypeInfo.As.EXISTING_PROPERTY");
1438+
}
1439+
1440+
/**
1441+
* With {@code disableDiscriminatorJsonIgnoreProperties=true} the jaxrs-spec template must OMIT
1442+
* {@code @JsonIgnoreProperties} (so a user-supplied one does not collide — Jackson forbids
1443+
* duplicate annotations) and switch {@code @JsonTypeInfo} to {@code JsonTypeInfo.As.EXISTING_PROPERTY}
1444+
* so the discriminator is not serialized twice. Aligns JavaJaxRS/spec/typeInfoAnnotation.mustache
1445+
* with Java/typeInfoAnnotation.mustache (PRs #22528 / #22924).
1446+
*/
1447+
@Test
1448+
public void disableDiscriminatorJsonIgnorePropertiesIsTrueThenJsonIgnorePropertiesShouldBeNotAdded() throws Exception {
1449+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1450+
output.deleteOnExit();
1451+
1452+
Map<String, Object> properties = new HashMap<>();
1453+
properties.put("legacyDiscriminatorBehavior", "false");
1454+
properties.put(DISABLE_DISCRIMINATOR_JSON_IGNORE_PROPERTIES, "true");
1455+
1456+
final CodegenConfigurator configurator = new CodegenConfigurator()
1457+
.setGeneratorName("jaxrs-spec")
1458+
.setAdditionalProperties(properties)
1459+
.setInputSpec("src/test/resources/3_0/jaxrs-spec/discriminator-mapping-children.yaml")
1460+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
1461+
1462+
DefaultGenerator generator = new DefaultGenerator();
1463+
Map<String, File> files = generator.opts(configurator.toClientOptInput()).generate().stream()
1464+
.collect(Collectors.toMap(File::getName, Function.identity()));
1465+
1466+
JavaFileAssert.assertThat(files.get("PetResponse.java"))
1467+
.fileDoesNotContain("@JsonIgnoreProperties(")
1468+
.fileContains("include = JsonTypeInfo.As.EXISTING_PROPERTY")
1469+
.fileDoesNotContain("include = JsonTypeInfo.As.PROPERTY");
1470+
}
1471+
14061472
/**
14071473
* With {@code useOneOfInterfaces=true} a oneOf schema is generated as a Java interface, and the
14081474
* concrete subtypes implement it. With {@code useSealed=true} the interface is {@code sealed} and

samples/server/petstore/kotlin-spring-cloud-4/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ dependencies {
4343
implementation("org.springframework.boot:spring-boot-starter-webmvc")
4444

4545
implementation("com.google.code.findbugs:jsr305:3.0.2")
46-
val jackson3Version = "3.1.0"
46+
val jackson3Version = "3.1.5"
4747
implementation("tools.jackson.dataformat:jackson-dataformat-yaml:$jackson3Version")
4848
implementation("tools.jackson.dataformat:jackson-dataformat-xml:$jackson3Version")
4949
implementation("tools.jackson.module:jackson-module-kotlin:$jackson3Version")

samples/server/petstore/kotlin-spring-cloud-4/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

samples/server/petstore/kotlin-spring-cloud-4/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<version>1.0.0</version>
99
<properties>
1010
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
11-
<jackson3.version>3.1.0</jackson3.version>
11+
<jackson3.version>3.1.5</jackson3.version>
1212
<jakarta-annotation.version>3.0.0</jakarta-annotation.version>
1313
<kotlin-test-junit5.version>2.2.0</kotlin-test-junit5.version>
1414

0 commit comments

Comments
 (0)