From a489a2e828acc8e21c7d4e761ee197b3c7fb4d2a Mon Sep 17 00:00:00 2001 From: William Cheng Date: Tue, 7 Dec 2021 21:38:54 +0800 Subject: [PATCH] [java][okhttp-gson-next-gen] better error message in oneOf/anyOf (#11059) * better error message * update tests --- .../okhttp-gson-nextgen/anyof_model.mustache | 10 +-- .../okhttp-gson-nextgen/oneof_model.mustache | 6 +- ...sting-with-http-signature-okhttp-gson.yaml | 6 -- .../.openapi-generator/FILES | 2 - .../java/okhttp-gson-nextgen/README.md | 1 - .../java/okhttp-gson-nextgen/api/openapi.yaml | 6 -- .../java/okhttp-gson-nextgen/docs/GmFruit.md | 2 +- .../java/org/openapitools/client/JSON.java | 1 - .../org/openapitools/client/model/Fruit.java | 4 +- .../openapitools/client/model/FruitReq.java | 4 +- .../openapitools/client/model/GmFruit.java | 62 +++---------------- .../org/openapitools/client/model/Mammal.java | 4 +- .../client/model/NullableShape.java | 4 +- .../org/openapitools/client/model/Pig.java | 4 +- .../client/model/Quadrilateral.java | 4 +- .../org/openapitools/client/model/Shape.java | 4 +- .../client/model/ShapeOrNull.java | 4 +- .../openapitools/client/model/Triangle.java | 4 +- .../org/openapitools/client/JSONTest.java | 16 ++++- 19 files changed, 51 insertions(+), 97 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache index e1727ddc047..2b41e44940a 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/anyof_model.mustache @@ -64,12 +64,14 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/anyOf}} - throw new IOException("Failed to deserialize as the type doesn't match anyOf schemas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}"); + throw new IOException("Failed to serialize as the type doesn't match anyOf schemas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}"); } @Override public {{classname}} read(JsonReader in) throws IOException { Object deserialized = null; + JsonObject jsonObject = elementAdapter.read(in).getAsJsonObject(); + {{#useOneOfDiscriminatorLookup}} {{#discriminator}} // use discriminator value for faster anyOf lookup @@ -78,7 +80,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im switch (discriminatorValue) { {{#mappedModels}} case "{{{mappingName}}}": - deserialized = gson.fromJson(in, {{{modelName}}}.class); + deserialized = adapter{{modelName}}.fromJsonTree(jsonObject); new{{classname}}.setActualInstance(deserialized); return new{{classname}}; {{/mappedModels}} @@ -92,7 +94,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im {{#anyOf}} // deserialize {{{.}}} try { - deserialized = gson.fromJson(in, {{.}}.class); + deserialized = adapter{{.}}.fromJsonTree(jsonObject); log.log(Level.FINER, "Input data matches schema '{{{.}}}'"); {{classname}} ret = new {{classname}}(); ret.setActualInstance(deserialized); @@ -103,7 +105,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/anyOf}} - throw new IOException("Failed deserialization for {{classname}}: no match found."); + throw new IOException(String.format("Failed deserialization for {{classname}} as data doesn't match anyOf schmeas: {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}. JSON: %s", jsonObject.toString())); } }.nullSafe(); } diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache index 48da5e472c3..a9300854dea 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/okhttp-gson-nextgen/oneof_model.mustache @@ -64,7 +64,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im } {{/oneOf}} - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}"); } @Override @@ -80,7 +80,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im switch (discriminatorValue) { {{#mappedModels}} case "{{{mappingName}}}": - deserialized = adapter{{.}}.fromJsonTree(jsonObject); + deserialized = adapter{{modelName}}.fromJsonTree(jsonObject); new{{classname}}.setActualInstance(deserialized); return new{{classname}}; {{/mappedModels}} @@ -110,7 +110,7 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im return ret; } - throw new IOException(String.format("Failed deserialization for {{classname}}: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for {{classname}}: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml b/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml index bf85279739e..92b32a47679 100644 --- a/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/java/petstore-with-fake-endpoints-models-for-testing-with-http-signature-okhttp-gson.yaml @@ -1888,11 +1888,6 @@ components: type: string pattern: /^[A-Z\s]*$/i nullable: true - pineapple: - type: object - properties: - origin: - type: string banana: type: object properties: @@ -1955,7 +1950,6 @@ components: color: type: string anyOf: - - $ref: '#/components/schemas/pineapple' - $ref: '#/components/schemas/apple' - $ref: '#/components/schemas/banana' additionalProperties: false diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES b/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES index 29da59bcd3e..39148a7980a 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES +++ b/samples/client/petstore/java/okhttp-gson-nextgen/.openapi-generator/FILES @@ -66,7 +66,6 @@ docs/ParentPet.md docs/Pet.md docs/PetApi.md docs/Pig.md -docs/Pineapple.md docs/Quadrilateral.md docs/QuadrilateralInterface.md docs/ReadOnlyFirst.md @@ -179,7 +178,6 @@ src/main/java/org/openapitools/client/model/OuterEnumIntegerDefaultValue.java src/main/java/org/openapitools/client/model/ParentPet.java src/main/java/org/openapitools/client/model/Pet.java src/main/java/org/openapitools/client/model/Pig.java -src/main/java/org/openapitools/client/model/Pineapple.java src/main/java/org/openapitools/client/model/Quadrilateral.java src/main/java/org/openapitools/client/model/QuadrilateralInterface.java src/main/java/org/openapitools/client/model/ReadOnlyFirst.java diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/README.md b/samples/client/petstore/java/okhttp-gson-nextgen/README.md index 3a81849aa6f..6110aea0fa0 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/README.md +++ b/samples/client/petstore/java/okhttp-gson-nextgen/README.md @@ -213,7 +213,6 @@ Class | Method | HTTP request | Description - [ParentPet](docs/ParentPet.md) - [Pet](docs/Pet.md) - [Pig](docs/Pig.md) - - [Pineapple](docs/Pineapple.md) - [Quadrilateral](docs/Quadrilateral.md) - [QuadrilateralInterface](docs/QuadrilateralInterface.md) - [ReadOnlyFirst](docs/ReadOnlyFirst.md) diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml b/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml index e2ecf87a054..8e64d05d5f2 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml +++ b/samples/client/petstore/java/okhttp-gson-nextgen/api/openapi.yaml @@ -2053,11 +2053,6 @@ components: pattern: /^[A-Z\s]*$/i type: string type: object - pineapple: - properties: - origin: - type: string - type: object banana: properties: lengthCm: @@ -2118,7 +2113,6 @@ components: gmFruit: additionalProperties: false anyOf: - - $ref: '#/components/schemas/pineapple' - $ref: '#/components/schemas/apple' - $ref: '#/components/schemas/banana' properties: diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md b/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md index d91eec57f89..1536d689689 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md +++ b/samples/client/petstore/java/okhttp-gson-nextgen/docs/GmFruit.md @@ -8,8 +8,8 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **color** | **String** | | [optional] -**origin** | **String** | | [optional] **cultivar** | **String** | | [optional] +**origin** | **String** | | [optional] **lengthCm** | **BigDecimal** | | [optional] diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java index 33e8ed752ef..40146a3e6f5 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/JSON.java @@ -270,7 +270,6 @@ public class JSON { .registerTypeAdapterFactory(new org.openapitools.client.model.ParentPet.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Pet.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Pig.CustomTypeAdapterFactory()) - .registerTypeAdapterFactory(new org.openapitools.client.model.Pineapple.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.Quadrilateral.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.QuadrilateralInterface.CustomTypeAdapterFactory()) .registerTypeAdapterFactory(new org.openapitools.client.model.ReadOnlyFirst.CustomTypeAdapterFactory()) diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java index 03436bd35b2..7ed501ad6df 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Fruit.java @@ -97,7 +97,7 @@ public class Fruit extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Apple, Banana"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: Apple, Banana"); } @Override @@ -133,7 +133,7 @@ public class Fruit extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Fruit: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Fruit: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java index 6a6ea0c82f6..5c886b122bc 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/FruitReq.java @@ -97,7 +97,7 @@ public class FruitReq extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: AppleReq, BananaReq"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: AppleReq, BananaReq"); } @Override @@ -133,7 +133,7 @@ public class FruitReq extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for FruitReq: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for FruitReq: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java index 4085fd34c10..36a4bd8b248 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/GmFruit.java @@ -26,7 +26,6 @@ import java.io.IOException; import java.math.BigDecimal; import org.openapitools.client.model.Apple; import org.openapitools.client.model.Banana; -import org.openapitools.client.model.Pineapple; import javax.ws.rs.core.GenericType; @@ -75,7 +74,6 @@ public class GmFruit extends AbstractOpenApiSchema { final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); final TypeAdapter adapterApple = gson.getDelegateAdapter(this, TypeToken.get(Apple.class)); final TypeAdapter adapterBanana = gson.getDelegateAdapter(this, TypeToken.get(Banana.class)); - final TypeAdapter adapterPineapple = gson.getDelegateAdapter(this, TypeToken.get(Pineapple.class)); return (TypeAdapter) new TypeAdapter() { @Override @@ -99,23 +97,18 @@ public class GmFruit extends AbstractOpenApiSchema { return; } - // check if the actual instance is of the type `Pineapple` - if (value.getActualInstance() instanceof Pineapple) { - JsonObject obj = adapterPineapple.toJsonTree((Pineapple)value.getActualInstance()).getAsJsonObject(); - elementAdapter.write(out, obj); - return; - } - - throw new IOException("Failed to deserialize as the type doesn't match anyOf schemas: Apple, Banana, Pineapple"); + throw new IOException("Failed to serialize as the type doesn't match anyOf schemas: Apple, Banana"); } @Override public GmFruit read(JsonReader in) throws IOException { Object deserialized = null; + JsonObject jsonObject = elementAdapter.read(in).getAsJsonObject(); + // deserialize Apple try { - deserialized = gson.fromJson(in, Apple.class); + deserialized = adapterApple.fromJsonTree(jsonObject); log.log(Level.FINER, "Input data matches schema 'Apple'"); GmFruit ret = new GmFruit(); ret.setActualInstance(deserialized); @@ -127,7 +120,7 @@ public class GmFruit extends AbstractOpenApiSchema { // deserialize Banana try { - deserialized = gson.fromJson(in, Banana.class); + deserialized = adapterBanana.fromJsonTree(jsonObject); log.log(Level.FINER, "Input data matches schema 'Banana'"); GmFruit ret = new GmFruit(); ret.setActualInstance(deserialized); @@ -137,19 +130,7 @@ public class GmFruit extends AbstractOpenApiSchema { log.log(Level.FINER, "Input data does not match schema 'Banana'", e); } - // deserialize Pineapple - try { - deserialized = gson.fromJson(in, Pineapple.class); - log.log(Level.FINER, "Input data matches schema 'Pineapple'"); - GmFruit ret = new GmFruit(); - ret.setActualInstance(deserialized); - return ret; - } catch (Exception e) { - // deserialization failed, continue - log.log(Level.FINER, "Input data does not match schema 'Pineapple'", e); - } - - throw new IOException("Failed deserialization for GmFruit: no match found."); + throw new IOException(String.format("Failed deserialization for GmFruit as data doesn't match anyOf schmeas: Apple, Banana. JSON: %s", jsonObject.toString())); } }.nullSafe(); } @@ -172,18 +153,11 @@ public class GmFruit extends AbstractOpenApiSchema { setActualInstance(o); } - public GmFruit(Pineapple o) { - super("anyOf", Boolean.FALSE); - setActualInstance(o); - } - static { schemas.put("Apple", new GenericType() { }); schemas.put("Banana", new GenericType() { }); - schemas.put("Pineapple", new GenericType() { - }); } @Override @@ -194,7 +168,7 @@ public class GmFruit extends AbstractOpenApiSchema { /** * Set the instance that matches the anyOf child schema, check * the instance parameter is valid against the anyOf child schemas: - * Apple, Banana, Pineapple + * Apple, Banana * * It could be an instance of the 'anyOf' schemas. * The anyOf child schemas may themselves be a composed schema (allOf, anyOf, anyOf). @@ -211,19 +185,14 @@ public class GmFruit extends AbstractOpenApiSchema { return; } - if (instance instanceof Pineapple) { - super.setActualInstance(instance); - return; - } - - throw new RuntimeException("Invalid instance type. Must be Apple, Banana, Pineapple"); + throw new RuntimeException("Invalid instance type. Must be Apple, Banana"); } /** * Get the actual instance, which can be the following: - * Apple, Banana, Pineapple + * Apple, Banana * - * @return The actual instance (Apple, Banana, Pineapple) + * @return The actual instance (Apple, Banana) */ @Override public Object getActualInstance() { @@ -252,16 +221,5 @@ public class GmFruit extends AbstractOpenApiSchema { return (Banana)super.getActualInstance(); } - /** - * Get the actual instance of `Pineapple`. If the actual instance is not `Pineapple`, - * the ClassCastException will be thrown. - * - * @return The actual instance of `Pineapple` - * @throws ClassCastException if the instance is not `Pineapple` - */ - public Pineapple getPineapple() throws ClassCastException { - return (Pineapple)super.getActualInstance(); - } - } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java index 1298c95a72c..21834a0903b 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Mammal.java @@ -105,7 +105,7 @@ public class Mammal extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Pig, Whale, Zebra"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: Pig, Whale, Zebra"); } @Override @@ -151,7 +151,7 @@ public class Mammal extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Mammal: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Mammal: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java index 9da8d1671bf..f2946ec60ec 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/NullableShape.java @@ -96,7 +96,7 @@ public class NullableShape extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); } @Override @@ -132,7 +132,7 @@ public class NullableShape extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for NullableShape: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for NullableShape: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java index 5271006630c..54982ba3f8e 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Pig.java @@ -96,7 +96,7 @@ public class Pig extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: BasquePig, DanishPig"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: BasquePig, DanishPig"); } @Override @@ -132,7 +132,7 @@ public class Pig extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Pig: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Pig: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java index 40785f69a73..aad102d3057 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Quadrilateral.java @@ -96,7 +96,7 @@ public class Quadrilateral extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: ComplexQuadrilateral, SimpleQuadrilateral"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: ComplexQuadrilateral, SimpleQuadrilateral"); } @Override @@ -132,7 +132,7 @@ public class Quadrilateral extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Quadrilateral: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Quadrilateral: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java index c6ebebc4a3f..23b4c43b002 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Shape.java @@ -96,7 +96,7 @@ public class Shape extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); } @Override @@ -132,7 +132,7 @@ public class Shape extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Shape: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Shape: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java index ddb66a3ec63..871b8881298 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/ShapeOrNull.java @@ -96,7 +96,7 @@ public class ShapeOrNull extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: Quadrilateral, Triangle"); } @Override @@ -132,7 +132,7 @@ public class ShapeOrNull extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for ShapeOrNull: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for ShapeOrNull: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java index a0f2a5847f9..9311228bf04 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/main/java/org/openapitools/client/model/Triangle.java @@ -105,7 +105,7 @@ public class Triangle extends AbstractOpenApiSchema { return; } - throw new IOException("Failed to deserialize as the type doesn't match oneOf schemas: EquilateralTriangle, IsoscelesTriangle, ScaleneTriangle"); + throw new IOException("Failed to serialize as the type doesn't match oneOf schemas: EquilateralTriangle, IsoscelesTriangle, ScaleneTriangle"); } @Override @@ -151,7 +151,7 @@ public class Triangle extends AbstractOpenApiSchema { return ret; } - throw new IOException(String.format("Failed deserialization for Triangle: %d classes match result, expected 1", match)); + throw new IOException(String.format("Failed deserialization for Triangle: %d classes match result, expected 1. JSON: %s", match, jsonObject.toString())); } }.nullSafe(); } diff --git a/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java index aab71f4c462..e7d783574f9 100644 --- a/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java +++ b/samples/client/petstore/java/okhttp-gson-nextgen/src/test/java/org/openapitools/client/JSONTest.java @@ -294,7 +294,6 @@ public class JSONTest { public void testAnyOfSchemaWithoutDiscriminator() throws Exception { { String str = "{ \"cultivar\": \"golden delicious\", \"origin\": \"japan\" }"; - String str2 = "{ \"origin_typo\": \"japan\" }"; // make sure deserialization works for pojo object Apple a = json.getGson().fromJson(str, Apple.class); @@ -309,8 +308,19 @@ public class JSONTest { assertEquals(json.getGson().toJson(inst), "{\"cultivar\":\"golden delicious\",\"origin\":\"japan\"}"); assertEquals(json.getGson().toJson(o), "{\"cultivar\":\"golden delicious\",\"origin\":\"japan\"}"); + String str2 = "{ \"origin_typo\": \"japan\" }"; // no match - Exception exception = assertThrows(com.google.gson.JsonSyntaxException.class, () -> { + Exception exception = assertThrows(java.lang.IllegalArgumentException.class, () -> { + Apple o3 = json.getGson().fromJson(str2, Apple.class); + }); + + // no match + Exception exception3 = assertThrows(java.lang.IllegalArgumentException.class, () -> { + Banana o2 = json.getGson().fromJson(str2, Banana.class); + }); + + // no match + Exception exception4 = assertThrows(com.google.gson.JsonSyntaxException.class, () -> { GmFruit o2 = json.getGson().fromJson(str2, GmFruit.class); }); } @@ -359,7 +369,7 @@ public class JSONTest { Exception exception = assertThrows(com.google.gson.JsonSyntaxException.class, () -> { FruitReq o = json.getGson().fromJson(str, FruitReq.class); }); - assertTrue(exception.getMessage().contains("Failed deserialization for FruitReq: 0 classes match result")); + assertTrue(exception.getMessage().contains("Failed deserialization for FruitReq: 0 classes match result, expected 1. JSON: {\"cultivar\":\"golden delicious\",\"mealy\":false,\"garbage_prop\":\"abc\"}")); } { String str = "{ \"lengthCm\": 17 }";