Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bin/configs/java-native-jackson3.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ additionalProperties:
generateBuilders: true
useReflectionEqualsHashCode: "true"
useJackson3: "true"
useJakartaEe: "true"
openApiNullable: "false"
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import {{invokerPackage}}.ApiClient;
import {{invokerPackage}}.JSON;

{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>xmlAnnotation}}
@JsonDeserialize(using={{classname}}.{{classname}}Deserializer.class)
@JsonDeserialize(using = {{classname}}.{{classname}}Deserializer.class)
@JsonSerialize(using = {{classname}}.{{classname}}Serializer.class)
public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-implements}} implements {{{.}}}{{^-last}}, {{/-last}}{{/vendorExtensions.x-implements}} {
private static final Logger log = Logger.getLogger({{classname}}.class.getName());
Expand Down Expand Up @@ -90,11 +90,12 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
{{#anyOf}}
// deserialize {{{.}}}
try {
final {{jacksonPackage}}.core.type.TypeReference<{{{.}}}> candidateRef = new {{jacksonPackage}}.core.type.TypeReference<{{{.}}}>() {};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: The anyOf deserializer still attempts every alternative for every JSON shape. Gate list alternatives on START_ARRAY and object alternatives on START_OBJECT before binding to prevent false or ambiguous matches.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At modules/openapi-generator/src/main/resources/Java/libraries/native/anyof_model.mustache, line 93:

<comment>The anyOf deserializer still attempts every alternative for every JSON shape. Gate list alternatives on `START_ARRAY` and object alternatives on `START_OBJECT` before binding to prevent false or ambiguous matches.</comment>

<file context>
@@ -90,11 +90,12 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
             {{#anyOf}}
             // deserialize {{{.}}}
             try {
+            final {{jacksonPackage}}.core.type.TypeReference<{{{.}}}> candidateRef = new {{jacksonPackage}}.core.type.TypeReference<{{{.}}}>() {};
 {{^useJackson3}}
-                deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class);
</file context>

{{^useJackson3}}
deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class);
deserialized = tree.traverse(jp.getCodec()).readValueAs(candidateRef);
{{/useJackson3}}
{{#useJackson3}}
deserialized = ctxt.readTreeAsValue(tree, {{{.}}}.class);
deserialized = ctxt.readTreeAsValue(tree, ctxt.constructType(candidateRef.getType()));
{{/useJackson3}}
{{classname}} ret = new {{classname}}();
ret.setActualInstance(deserialized);
Expand Down Expand Up @@ -159,17 +160,28 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties);
}
{{/additionalPropertiesType}}
{{#anyOf}}
public {{classname}}({{{.}}} o) {
{{#composedSchemas.anyOf}}
{{^isArray}}
{{^isMap}}
public {{classname}}({{{dataType}}} o) {
super("anyOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
setActualInstance(o);
}
{{/isMap}}
{{/isArray}}

{{/anyOf}}
{{/composedSchemas.anyOf}}
{{#vendorExtensions.x-has-list-alternative}}
public {{classname}}(java.util.List<?> o) {
this();
setActualInstance(o);
}

{{/vendorExtensions.x-has-list-alternative}}
static {
{{#anyOf}}
schemas.put("{{{.}}}", {{{.}}}.class);
{{/anyOf}}
{{#composedSchemas.anyOf}}
schemas.put("{{{dataType}}}", {{#isArray}}{{#uniqueItems}}java.util.Set{{/uniqueItems}}{{^uniqueItems}}java.util.List{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}java.util.Map{{/isMap}}{{^isMap}}{{{dataType}}}{{/isMap}}{{/isArray}}.class);
{{/composedSchemas.anyOf}}
JSON.registerDescendants({{classname}}.class, Collections.unmodifiableMap(schemas));
{{#discriminator}}
// Initialize and register the discriminator mappings.
Expand All @@ -190,7 +202,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
/**
* Set the instance that matches the anyOf child schema, check
* the instance parameter is valid against the anyOf child schemas:
* {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}
* {{#anyOf}}{{.}}{{^-last}}, {{/-last}}{{/anyOf}}
*
* It could be an instance of the 'anyOf' schemas.
* The anyOf child schemas may themselves be a composed schema (allOf, anyOf, anyOf).
Expand All @@ -204,40 +216,40 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
}

{{/isNullable}}
{{#anyOf}}
if (JSON.isInstanceOf({{{.}}}.class, instance, new HashSet<Class<?>>())) {
{{#composedSchemas.anyOf}}
if (JSON.isInstanceOf({{#isArray}}{{#uniqueItems}}java.util.Set{{/uniqueItems}}{{^uniqueItems}}java.util.List{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}java.util.Map{{/isMap}}{{^isMap}}{{{dataType}}}{{/isMap}}{{/isArray}}.class, instance, new HashSet<Class<?>>())) {
super.setActualInstance(instance);
return;
}

{{/anyOf}}
{{/composedSchemas.anyOf}}
throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
}

/**
* Get the actual instance, which can be the following:
* {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}
* {{#anyOf}}{{.}}{{^-last}}, {{/-last}}{{/anyOf}}
*
* @return The actual instance ({{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}})
* @return The actual instance ({{#anyOf}}{{.}}{{^-last}}, {{/-last}}{{/anyOf}})
*/
@Override
public Object getActualInstance() {
return super.getActualInstance();
}

{{#anyOf}}
{{#composedSchemas.anyOf}}
/**
* Get the actual instance of `{{{.}}}`. If the actual instance is not `{{{.}}}`,
* Get the actual instance of `{{dataType}}`. If the actual instance is not `{{dataType}}`,
* the ClassCastException will be thrown.
*
* @return The actual instance of `{{{.}}}`
* @throws ClassCastException if the instance is not `{{{.}}}`
* @return The actual instance of `{{dataType}}`
* @throws ClassCastException if the instance is not `{{dataType}}`
*/
public {{{.}}} get{{{.}}}() throws ClassCastException {
return ({{{.}}})super.getActualInstance();
public {{{dataType}}} get{{#isArray}}{{#uniqueItems}}Set{{{items.dataType}}}{{/uniqueItems}}{{^uniqueItems}}List{{{items.dataType}}}{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}Map{{{items.dataType}}}{{/isMap}}{{^isMap}}{{/isMap}}{{{dataType}}}{{/isArray}}() throws ClassCastException {
return ({{{dataType}}})super.getActualInstance();
}

{{/anyOf}}
{{/composedSchemas.anyOf}}

{{#supportUrlQuery}}

Expand Down Expand Up @@ -275,7 +287,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im

{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
if (getActualInstance() instanceof {{{dataType}}}) {
if (getActualInstance() instanceof {{#isArray}}{{#uniqueItems}}Set<?>{{/uniqueItems}}{{^uniqueItems}}List<?>{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}Map<?,?>{{/isMap}}{{^isMap}}{{/isMap}}{{{dataType}}}{{/isArray}}) {
{{#isArray}}
{{#items.isPrimitiveType}}
{{#uniqueItems}}
Expand Down Expand Up @@ -315,9 +327,11 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
{{/uniqueItems}}
{{^uniqueItems}}
if (getActualInstance() != null) {
for (int i = 0; i < (({{{dataType}}})getActualInstance()).size(); i++) {
if ((({{{dataType}}})getActualInstance()).get(i) != null) {
joiner.add((({{{items.dataType}}})getActualInstance()).get(i).toUrlQueryString(String.format(java.util.Locale.ROOT, "%s{{baseName}}%s%s", prefix, suffix,
{{{dataType}}} items = ({{{dataType}}}) getActualInstance();
for (int i = 0; i < items.size(); i++) {
{{{items.dataType}}} item = items.get(i);
if (item != null) {
joiner.add(item.toUrlQueryString(String.format(java.util.Locale.ROOT, "%s{{baseName}}%s%s", prefix, suffix,
"".equals(suffix) ? "" : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i, containerSuffix))));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

{{/description}}
## anyOf schemas
{{#anyOf}}
* [{{{.}}}]({{{.}}}.md)
{{/anyOf}}
{{#composedSchemas.anyOf}}
* [{{dataType}}]({{#isArray}}{{#uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{^uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}{{items.dataType}}{{/isMap}}{{^isMap}}{{dataType}}{{/isMap}}{{/isArray}}.md)
{{/composedSchemas.anyOf}}

{{#isNullable}}
NOTE: this class is nullable.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

{{/description}}
## oneOf schemas
{{#oneOf}}
* [{{{.}}}]({{{.}}}.md)
{{/oneOf}}
{{#composedSchemas.oneOf}}
* [{{dataType}}]({{#isArray}}{{#uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{^uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}{{items.dataType}}{{/isMap}}{{^isMap}}{{dataType}}{{/isMap}}{{/isArray}}.md)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: Nested container alternatives still produce broken documentation links: items.dataType unwraps only one level, so List<List<Apple>> links to List<Apple>.md, which is not generated. Resolve the innermost model type recursively or omit the link for non-model containers.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At modules/openapi-generator/src/main/resources/Java/libraries/native/model_oneof_doc.mustache, line 9:

<comment>Nested container alternatives still produce broken documentation links: `items.dataType` unwraps only one level, so `List<List<Apple>>` links to `List<Apple>.md`, which is not generated. Resolve the innermost model type recursively or omit the link for non-model containers.</comment>

<file context>
@@ -5,9 +5,9 @@
-* [{{{.}}}]({{{.}}}.md)
-{{/oneOf}}
+{{#composedSchemas.oneOf}}
+* [{{dataType}}]({{#isArray}}{{#uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{^uniqueItems}}{{items.dataType}}{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}{{items.dataType}}{{/isMap}}{{^isMap}}{{dataType}}{{/isMap}}{{/isArray}}.md)
+{{/composedSchemas.oneOf}}
 
</file context>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Majority of the time, this won't be needed since it would normally be then wrapped in a named object schema. (or can be restructured to be like so)

{{/composedSchemas.oneOf}}

{{#isNullable}}
NOTE: this class is nullable.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,26 +115,34 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
{{#oneOf}}
// deserialize {{{.}}}
try {
final {{jacksonPackage}}.core.type.TypeReference<{{{.}}}> candidateRef = new {{jacksonPackage}}.core.type.TypeReference<{{{.}}}>() {};
final {{jacksonPackage}}.databind.JavaType candidateType = ctxt.getTypeFactory().constructType(candidateRef);
final Class<?> candidateClass = candidateType.getRawClass();
boolean attemptParsing = true;
// containers (List/Set/Map) must match the JSON shape; element types are checked while binding
if (candidateType.isCollectionLikeType()) {
attemptParsing = token == JsonToken.START_ARRAY;
} else if (candidateType.isMapLikeType()) {
attemptParsing = token == JsonToken.START_OBJECT;
// ensure that we respect type coercion as set on the client ObjectMapper
if ({{{.}}}.class.equals(Integer.class) || {{{.}}}.class.equals(Long.class) || {{{.}}}.class.equals(Float.class) || {{{.}}}.class.equals(Double.class) || {{{.}}}.class.equals(Boolean.class) || {{{.}}}.class.equals(String.class)) {
} else if (candidateClass.equals(Integer.class) || candidateClass.equals(Long.class) || candidateClass.equals(Float.class) || candidateClass.equals(Double.class) || candidateClass.equals(Boolean.class) || candidateClass.equals(String.class)) {
attemptParsing = typeCoercion;
if (!attemptParsing) {
attemptParsing |= (({{{.}}}.class.equals(Integer.class) || {{{.}}}.class.equals(Long.class)) && token == JsonToken.VALUE_NUMBER_INT);
attemptParsing |= (({{{.}}}.class.equals(Float.class) || {{{.}}}.class.equals(Double.class)) && token == JsonToken.VALUE_NUMBER_FLOAT);
attemptParsing |= ({{{.}}}.class.equals(Boolean.class) && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE));
attemptParsing |= ({{{.}}}.class.equals(String.class) && token == JsonToken.VALUE_STRING);
attemptParsing |= ((candidateClass.equals(Integer.class) || candidateClass.equals(Long.class)) && token == JsonToken.VALUE_NUMBER_INT);
attemptParsing |= ((candidateClass.equals(Float.class) || candidateClass.equals(Double.class)) && token == JsonToken.VALUE_NUMBER_FLOAT);
attemptParsing |= (candidateClass.equals(Boolean.class) && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE));
attemptParsing |= (candidateClass.equals(String.class) && token == JsonToken.VALUE_STRING);
{{#isNullable}}
attemptParsing |= (token == JsonToken.VALUE_NULL);
{{/isNullable}}
}
}
if (attemptParsing) {
{{^useJackson3}}
deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class);
deserialized = tree.traverse(jp.getCodec()).readValueAs(candidateRef);
{{/useJackson3}}
{{#useJackson3}}
deserialized = ctxt.readTreeAsValue(tree, {{{.}}}.class);
deserialized = ctxt.readTreeAsValue(tree, ctxt.constructType(candidateType));
{{/useJackson3}}
// TODO: there is no validation against JSON schema constraints
// (min, max, enum, pattern...), this does not perform a strict JSON
Expand Down Expand Up @@ -207,17 +215,28 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
return Objects.hash(getActualInstance(), isNullable(), getSchemaType(), additionalProperties);
}
{{/additionalPropertiesType}}
{{#oneOf}}
public {{classname}}({{{.}}} o) {
{{#composedSchemas.oneOf}}
{{^isArray}}
{{^isMap}}
public {{classname}}({{{dataType}}} o) {
super("oneOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
setActualInstance(o);
}
{{/isMap}}
{{/isArray}}

{{/oneOf}}
{{/composedSchemas.oneOf}}
{{#vendorExtensions.x-has-list-alternative}}
public {{classname}}(java.util.List<?> o) {
super("oneOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
setActualInstance(o);
}

{{/vendorExtensions.x-has-list-alternative}}
static {
{{#oneOf}}
schemas.put("{{{.}}}", {{{.}}}.class);
{{/oneOf}}
{{#composedSchemas.oneOf}}
schemas.put("{{{dataType}}}", {{#isArray}}{{#uniqueItems}}java.util.Set{{/uniqueItems}}{{^uniqueItems}}java.util.List{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}java.util.Map{{/isMap}}{{^isMap}}{{{dataType}}}{{/isMap}}{{/isArray}}.class);
{{/composedSchemas.oneOf}}
JSON.registerDescendants({{classname}}.class, Collections.unmodifiableMap(schemas));
{{#discriminator}}
// Initialize and register the discriminator mappings.
Expand All @@ -238,7 +257,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
/**
* Set the instance that matches the oneOf child schema, check
* the instance parameter is valid against the oneOf child schemas:
* {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}
* {{#oneOf}}{{.}}{{^-last}}, {{/-last}}{{/oneOf}}
*
* It could be an instance of the 'oneOf' schemas.
* The oneOf child schemas may themselves be a composed schema (allOf, anyOf, oneOf).
Expand All @@ -252,40 +271,40 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
}

{{/isNullable}}
{{#oneOf}}
if (JSON.isInstanceOf({{{.}}}.class, instance, new HashSet<Class<?>>())) {
{{#composedSchemas.oneOf}}
if (JSON.isInstanceOf({{#isArray}}{{#uniqueItems}}java.util.Set{{/uniqueItems}}{{^uniqueItems}}java.util.List{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}java.util.Map{{/isMap}}{{^isMap}}{{{dataType}}}{{/isMap}}{{/isArray}}.class, instance, new HashSet<Class<?>>())) {
super.setActualInstance(instance);
return;
}

{{/oneOf}}
{{/composedSchemas.oneOf}}
throw new RuntimeException("Invalid instance type. Must be {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}");
}

/**
* Get the actual instance, which can be the following:
* {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}
* {{#oneOf}}{{.}}{{^-last}}, {{/-last}}{{/oneOf}}
*
* @return The actual instance ({{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}})
* @return The actual instance ({{#oneOf}}{{.}}{{^-last}}, {{/-last}}{{/oneOf}})
*/
@Override
public Object getActualInstance() {
return super.getActualInstance();
}

{{#oneOf}}
{{#composedSchemas.oneOf}}
/**
* Get the actual instance of `{{{.}}}`. If the actual instance is not `{{{.}}}`,
* Get the actual instance of `{{dataType}}`. If the actual instance is not `{{dataType}}`,
* the ClassCastException will be thrown.
*
* @return The actual instance of `{{{.}}}`
* @throws ClassCastException if the instance is not `{{{.}}}`
* @return The actual instance of `{{dataType}}`
* @throws ClassCastException if the instance is not `{{dataType}}`
*/
public {{{.}}} get{{{.}}}() throws ClassCastException {
return ({{{.}}})super.getActualInstance();
public {{{dataType}}} get{{#isArray}}{{#uniqueItems}}Set{{{items.dataType}}}{{/uniqueItems}}{{^uniqueItems}}List{{{items.dataType}}}{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}Map{{{items.dataType}}}{{/isMap}}{{^isMap}}{{/isMap}}{{{dataType}}}{{/isArray}}() throws ClassCastException {
return ({{{dataType}}})super.getActualInstance();
}

{{/oneOf}}
{{/composedSchemas.oneOf}}

{{#supportUrlQuery}}

Expand Down Expand Up @@ -323,7 +342,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im

{{#composedSchemas.oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
if (getActualInstance() instanceof {{{dataType}}}) {
if (getActualInstance() instanceof {{#isArray}}{{#uniqueItems}}Set<?>{{/uniqueItems}}{{^uniqueItems}}List<?>{{/uniqueItems}}{{/isArray}}{{^isArray}}{{#isMap}}Map<?,?>{{/isMap}}{{^isMap}}{{/isMap}}{{{dataType}}}{{/isArray}}) {
{{#isArray}}
{{#items.isPrimitiveType}}
{{#uniqueItems}}
Expand Down Expand Up @@ -363,9 +382,11 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
{{/uniqueItems}}
{{^uniqueItems}}
if (getActualInstance() != null) {
for (int i = 0; i < (({{{dataType}}})getActualInstance()).size(); i++) {
if ((({{{dataType}}})getActualInstance()).get(i) != null) {
joiner.add((({{{items.dataType}}})getActualInstance()).get(i).toUrlQueryString(String.format(java.util.Locale.ROOT, "%s{{baseName}}%s%s", prefix, suffix,
{{{dataType}}} items = ({{{dataType}}}) getActualInstance();
for (int i = 0; i < items.size(); i++) {
{{{items.dataType}}} item = items.get(i);
if (item != null) {
joiner.add(item.toUrlQueryString(String.format(java.util.Locale.ROOT, "%s{{baseName}}%s%s", prefix, suffix,
"".equals(suffix) ? "" : String.format(java.util.Locale.ROOT, "%s%d%s", containerPrefix, i, containerSuffix))));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,17 +340,17 @@
<maven.compiler.target>17</maven.compiler.target>
{{/useJackson3}}
{{^useJackson3}}
<jackson-version>2.21.6</jackson-version>
<jackson-annotations-version>2.21</jackson-annotations-version>
<jackson-version>2.22.3</jackson-version>
<jackson-annotations-version>2.22</jackson-annotations-version>
<jackson-databind-nullable-version>0.2.12</jackson-databind-nullable-version>
{{/useJackson3}}
{{#useJackson3}}
<jackson3-version>3.1.6</jackson3-version>
<jackson-annotations-version>2.21</jackson-annotations-version>
<jackson3-version>3.2.3</jackson3-version>
<jackson-annotations-version>2.22</jackson-annotations-version>
<jackson-databind-nullable-version>0.2.12</jackson-databind-nullable-version>
{{/useJackson3}}
{{#useJakartaEe}}
<jakarta-annotation-version>2.1.1</jakarta-annotation-version>
<jakarta-annotation-version>3.0.0</jakarta-annotation-version>
<beanvalidation-version>3.0.2</beanvalidation-version>
{{/useJakartaEe}}
{{^useJakartaEe}}
Expand All @@ -361,7 +361,7 @@
<httpmime-version>4.5.14</httpmime-version>
{{/hasFormParamsInSpec}}
{{#useReflectionEqualsHashCode}}
<commons-lang3-version>3.17.0</commons-lang3-version>
<commons-lang3-version>3.21.0</commons-lang3-version>
{{/useReflectionEqualsHashCode}}
<junit-version>5.10.2</junit-version>
<spotless.version>2.27.2</spotless.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -344,11 +344,6 @@
<artifactId>play-ahc-ws_2.12</artifactId>
<version>${play-version}</version>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>${beanvalidation-version}</version>
</dependency>
{{/usePlayWS}}
{{#parcelableModel}}
<!-- Needed for Parcelable support-->
Expand Down
Loading
Loading