Skip to content

Commit aa4018d

Browse files
authored
[Java] fix nullable arrays when JsonNullable is used (#10012)
1 parent ddd23ab commit aa4018d

File tree

56 files changed

+2965
-70
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2965
-70
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
generatorName: java
2+
outputDir: samples/client/petstore/java/webclient-nulable-arrays
3+
library: webclient
4+
inputSpec: modules/openapi-generator/src/test/resources/3_0/schema-with-nullable-arrays.yaml
5+
additionalProperties:
6+
artifactId: petstore-webclient-nullable-arrays
7+
hideGenerationTimestamp: "true"

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,13 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
12191219
model.imports.add("ApiModelProperty");
12201220
model.imports.add("ApiModel");
12211221
}
1222+
1223+
if (openApiNullable) {
1224+
if (Boolean.FALSE.equals(property.required) && Boolean.TRUE.equals(property.isNullable)) {
1225+
model.imports.add("JsonNullable");
1226+
model.getVendorExtensions().put("x-jackson-optional-nullable-helpers", true);
1227+
}
1228+
}
12221229
}
12231230

12241231
@Override

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJerseyServerCodegen.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ public void processOpts() {
126126
supportingFiles.add(new SupportingFile("web.mustache", ("src/main/webapp/WEB-INF"), "web.xml")
127127
.doNotOverwrite());
128128
supportingFiles.add(new SupportingFile("StringUtil.mustache", (sourceFolder + '/' + apiPackage).replace(".", "/"), "StringUtil.java"));
129+
130+
// JsonNullable is not implemented for this generator
131+
openApiNullable = false;
129132
}
130133

131134

modules/openapi-generator/src/main/resources/Java/libraries/jersey2/pojo.mustache

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,23 +278,36 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorE
278278
return false;
279279
}{{#hasVars}}
280280
{{classname}} {{classVarName}} = ({{classname}}) o;
281-
return {{#vars}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{^-last}} &&
281+
return {{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}equalsNullable(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}} &&
282282
{{/-last}}{{/vars}}{{#additionalPropertiesType}}&&
283283
Objects.equals(this.additionalProperties, {{classVarName}}.additionalProperties){{/additionalPropertiesType}}{{#parent}} &&
284284
super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
285285
return {{#parent}}super.equals(o){{/parent}}{{^parent}}true{{/parent}};{{/hasVars}}
286286
{{/useReflectionEqualsHashCode}}
287-
}
287+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
288+
289+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
290+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
291+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
288292
289293
@Override
290294
public int hashCode() {
291295
{{#useReflectionEqualsHashCode}}
292296
return HashCodeBuilder.reflectionHashCode(this);
293297
{{/useReflectionEqualsHashCode}}
294298
{{^useReflectionEqualsHashCode}}
295-
return Objects.hash({{#vars}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}}{{#additionalPropertiesType}}{{#hasVars}}, {{/hasVars}}{{^hasVars}}{{#parent}}, {{/parent}}{{/hasVars}}additionalProperties{{/additionalPropertiesType}});
299+
return Objects.hash({{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}hashCodeNullable({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}}{{#additionalPropertiesType}}{{#hasVars}}, {{/hasVars}}{{^hasVars}}{{#parent}}, {{/parent}}{{/hasVars}}additionalProperties{{/additionalPropertiesType}});
296300
{{/useReflectionEqualsHashCode}}
297-
}
301+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
302+
303+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
304+
if (a == null) {
305+
return 1;
306+
}
307+
return a.isPresent()
308+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
309+
: 31;
310+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
298311
299312
@Override
300313
public String toString() {

modules/openapi-generator/src/main/resources/Java/libraries/native/pojo.mustache

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,23 +281,36 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorE
281281
return false;
282282
}{{#hasVars}}
283283
{{classname}} {{classVarName}} = ({{classname}}) o;
284-
return {{#vars}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{^-last}} &&
284+
return {{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}equalsNullable(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}} &&
285285
{{/-last}}{{/vars}}{{#additionalPropertiesType}}&&
286286
Objects.equals(this.additionalProperties, {{classVarName}}.additionalProperties){{/additionalPropertiesType}}{{#parent}} &&
287287
super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
288288
return {{#parent}}super.equals(o){{/parent}}{{^parent}}true{{/parent}};{{/hasVars}}
289289
{{/useReflectionEqualsHashCode}}
290-
}
290+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
291+
292+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
293+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
294+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
291295
292296
@Override
293297
public int hashCode() {
294298
{{#useReflectionEqualsHashCode}}
295299
return HashCodeBuilder.reflectionHashCode(this);
296300
{{/useReflectionEqualsHashCode}}
297301
{{^useReflectionEqualsHashCode}}
298-
return Objects.hash({{#vars}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}}{{#additionalPropertiesType}}, additionalProperties{{/additionalPropertiesType}});
302+
return Objects.hash({{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}hashCodeNullable({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}}{{#additionalPropertiesType}}, additionalProperties{{/additionalPropertiesType}});
299303
{{/useReflectionEqualsHashCode}}
300-
}
304+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
305+
306+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
307+
if (a == null) {
308+
return 1;
309+
}
310+
return a.isPresent()
311+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
312+
: 31;
313+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
301314
302315
@Override
303316
public String toString() {

modules/openapi-generator/src/main/resources/Java/pojo.mustache

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,22 +255,35 @@ public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#vendorE
255255
return false;
256256
}{{#hasVars}}
257257
{{classname}} {{classVarName}} = ({{classname}}) o;
258-
return {{#vars}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{^-last}} &&
258+
return {{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}equalsNullable(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}} &&
259259
{{/-last}}{{/vars}}{{#parent}} &&
260260
super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
261261
return {{#parent}}super.equals(o){{/parent}}{{^parent}}true{{/parent}};{{/hasVars}}
262262
{{/useReflectionEqualsHashCode}}
263-
}
263+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
264+
265+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
266+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
267+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
264268
265269
@Override
266270
public int hashCode() {
267271
{{#useReflectionEqualsHashCode}}
268272
return HashCodeBuilder.reflectionHashCode(this);
269273
{{/useReflectionEqualsHashCode}}
270274
{{^useReflectionEqualsHashCode}}
271-
return Objects.hash({{#vars}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});
275+
return Objects.hash({{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}hashCodeNullable({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});
272276
{{/useReflectionEqualsHashCode}}
273-
}
277+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
278+
279+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
280+
if (a == null) {
281+
return 1;
282+
}
283+
return a.isPresent()
284+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
285+
: 31;
286+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
274287
275288
@Override
276289
public String toString() {

modules/openapi-generator/src/main/resources/JavaSpring/pojo.mustache

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,29 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}}{{^parent}}
132132
return false;
133133
}{{#hasVars}}
134134
{{classname}} {{classVarName}} = ({{classname}}) o;
135-
return {{#vars}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{^-last}} &&
135+
return {{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}equalsNullable(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}} &&
136136
{{/-last}}{{/vars}}{{#parent}} &&
137137
super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
138138
return true;{{/hasVars}}
139-
}
139+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
140+
141+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
142+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
143+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
140144

141145
@Override
142146
public int hashCode() {
143-
return Objects.hash({{#vars}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});
144-
}
147+
return Objects.hash({{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}hashCodeNullable({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});
148+
}{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
149+
150+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
151+
if (a == null) {
152+
return 1;
153+
}
154+
return a.isPresent()
155+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
156+
: 31;
157+
}{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
145158

146159
@Override
147160
public String toString() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public void testPostProcessNullableModelPropertyWithOpenApiNullableEnabledButJac
276276
codegenProperty.isNullable = true;
277277

278278
codegen.postProcessModelProperty(codegenModel, codegenProperty);
279-
Assert.assertFalse(codegenModel.imports.contains("JsonNullable"));
279+
Assert.assertTrue(codegenModel.imports.contains("JsonNullable"));
280280
Assert.assertFalse(codegenModel.imports.contains("JsonIgnore"));
281281
Assert.assertNull(codegenProperty.getVendorExtensions().get("x-is-jackson-optional-nullable"));
282282
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
openapi: 3.0.0
2+
info:
3+
title: 'Minimal Example '
4+
description: byte Array error in equal method
5+
version: v1
6+
paths:
7+
/nullable-array-test:
8+
get:
9+
summary: ''
10+
description: ''
11+
operationId: ''
12+
parameters: []
13+
responses:
14+
'200':
15+
description: ''
16+
content:
17+
application/json:
18+
schema:
19+
type: array
20+
items:
21+
"$ref": "#/components/schemas/ByteArrayObject"
22+
components:
23+
schemas:
24+
ByteArrayObject:
25+
type: object
26+
properties:
27+
nullableArray:
28+
type: string
29+
description: byte array.
30+
format: byte
31+
nullable: true
32+
normalArray:
33+
type: string
34+
description: byte array.
35+
format: byte
36+
nullableString:
37+
type: string
38+
nullable: true
39+
stringField:
40+
type: string
41+
intField:
42+
type: number
43+
format: int32

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,7 @@
13431343
<module>samples/client/petstore/java/resttemplate</module>
13441344
<module>samples/client/petstore/java/resttemplate-withXml</module>
13451345
<module>samples/client/petstore/java/webclient</module>
1346+
<module>samples/client/petstore/java/webclient-nulable-arrays</module>
13461347
<module>samples/client/petstore/java/vertx</module>
13471348
<module>samples/client/petstore/java/jersey2-java8-localdatetime</module>
13481349
<module>samples/client/petstore/java/resteasy</module>

samples/client/petstore/java/feign/src/main/java/org/openapitools/client/model/EnumTest.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.openapitools.client.model.OuterEnumDefaultValue;
2727
import org.openapitools.client.model.OuterEnumInteger;
2828
import org.openapitools.client.model.OuterEnumIntegerDefaultValue;
29+
import org.openapitools.jackson.nullable.JsonNullable;
2930
import com.fasterxml.jackson.annotation.JsonIgnore;
3031
import org.openapitools.jackson.nullable.JsonNullable;
3132
import java.util.NoSuchElementException;
@@ -453,15 +454,28 @@ public boolean equals(Object o) {
453454
Objects.equals(this.enumStringRequired, enumTest.enumStringRequired) &&
454455
Objects.equals(this.enumInteger, enumTest.enumInteger) &&
455456
Objects.equals(this.enumNumber, enumTest.enumNumber) &&
456-
Objects.equals(this.outerEnum, enumTest.outerEnum) &&
457+
equalsNullable(this.outerEnum, enumTest.outerEnum) &&
457458
Objects.equals(this.outerEnumInteger, enumTest.outerEnumInteger) &&
458459
Objects.equals(this.outerEnumDefaultValue, enumTest.outerEnumDefaultValue) &&
459460
Objects.equals(this.outerEnumIntegerDefaultValue, enumTest.outerEnumIntegerDefaultValue);
460461
}
461462

463+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
464+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
465+
}
466+
462467
@Override
463468
public int hashCode() {
464-
return Objects.hash(enumString, enumStringRequired, enumInteger, enumNumber, outerEnum, outerEnumInteger, outerEnumDefaultValue, outerEnumIntegerDefaultValue);
469+
return Objects.hash(enumString, enumStringRequired, enumInteger, enumNumber, hashCodeNullable(outerEnum), outerEnumInteger, outerEnumDefaultValue, outerEnumIntegerDefaultValue);
470+
}
471+
472+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
473+
if (a == null) {
474+
return 1;
475+
}
476+
return a.isPresent()
477+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
478+
: 31;
465479
}
466480

467481
@Override

samples/client/petstore/java/feign/src/main/java/org/openapitools/client/model/HealthCheckResult.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.fasterxml.jackson.annotation.JsonValue;
2323
import io.swagger.annotations.ApiModel;
2424
import io.swagger.annotations.ApiModelProperty;
25+
import org.openapitools.jackson.nullable.JsonNullable;
2526
import com.fasterxml.jackson.annotation.JsonIgnore;
2627
import org.openapitools.jackson.nullable.JsonNullable;
2728
import java.util.NoSuchElementException;
@@ -85,12 +86,25 @@ public boolean equals(Object o) {
8586
return false;
8687
}
8788
HealthCheckResult healthCheckResult = (HealthCheckResult) o;
88-
return Objects.equals(this.nullableMessage, healthCheckResult.nullableMessage);
89+
return equalsNullable(this.nullableMessage, healthCheckResult.nullableMessage);
90+
}
91+
92+
private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
93+
return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && a.get().getClass().isArray() ? Arrays.equals((T[])a.get(), (T[])b.get()) : Objects.equals(a.get(), b.get()));
8994
}
9095

9196
@Override
9297
public int hashCode() {
93-
return Objects.hash(nullableMessage);
98+
return Objects.hash(hashCodeNullable(nullableMessage));
99+
}
100+
101+
private static <T> int hashCodeNullable(JsonNullable<T> a) {
102+
if (a == null) {
103+
return 1;
104+
}
105+
return a.isPresent()
106+
? (a.get().getClass().isArray() ? Arrays.hashCode((T[])a.get()) : Objects.hashCode(a.get()))
107+
: 31;
94108
}
95109

96110
@Override

0 commit comments

Comments
 (0)