Skip to content

Commit 707a88d

Browse files
authored
java jersey2 enhance anyOf (#6420)
1 parent 0572030 commit 707a88d

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,49 @@
11
import javax.ws.rs.core.GenericType;
22
import javax.ws.rs.core.Response;
3+
import java.io.IOException;
34
import java.util.ArrayList;
45
import java.util.HashMap;
56
import java.util.Map;
67

8+
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.core.JsonProcessingException;
10+
import com.fasterxml.jackson.databind.DeserializationContext;
11+
import com.fasterxml.jackson.databind.JsonNode;
12+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
13+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
14+
715
{{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{>xmlAnnotation}}
16+
@JsonDeserialize(using={{classname}}.{{classname}}Deserializer.class)
817
public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-implements}}, {{{.}}}{{/vendorExtensions.x-implements}} {
18+
public static class {{classname}}Deserializer extends StdDeserializer<{{classname}}> {
19+
public {{classname}}Deserializer() {
20+
this({{classname}}.class);
21+
}
22+
23+
public {{classname}}Deserializer(Class<?> vc) {
24+
super(vc);
25+
}
26+
27+
@Override
28+
public {{classname}} deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
29+
JsonNode tree = jp.readValueAsTree();
30+
31+
Object deserialized = null;
32+
{{#anyOf}}
33+
// deserialzie {{{.}}}
34+
try {
35+
deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class);
36+
{{classname}} ret = new {{classname}}();
37+
ret.setActualInstance(deserialized);
38+
return ret;
39+
} catch (Exception e) {
40+
// deserialization failed, continue
41+
}
42+
43+
{{/anyOf}}
44+
throw new IOException(String.format("Failed deserialization for {{classname}}: no match found"));
45+
}
46+
}
947

1048
// store a list of schema names defined in anyOf
1149
public final static Map<String, GenericType> schemas = new HashMap<String, GenericType>();
@@ -14,6 +52,13 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
1452
super("anyOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
1553
}
1654

55+
{{#anyOf}}
56+
public {{classname}}({{{.}}} o) {
57+
super("anyOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
58+
setActualInstance(o);
59+
}
60+
61+
{{/anyOf}}
1762
static {
1863
{{#anyOf}}
1964
schemas.put("{{{.}}}", new GenericType<{{{.}}}>() {
@@ -42,6 +87,6 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
4287
}
4388

4489
{{/anyOf}}
45-
throw new RuntimeException("Invalid instance type. Must be {{#oneOf}}{{{.}}}{{^-last}}, {{/-last}}{{/oneOf}}");
90+
throw new RuntimeException("Invalid instance type. Must be {{#anyOf}}{{{.}}}{{^-last}}, {{/-last}}{{/anyOf}}");
4691
}
4792
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
3131
int match = 0;
3232
Object deserialized = null;
3333
{{#oneOf}}
34+
// deserialize {{{.}}}
3435
try {
3536
deserialized = tree.traverse(jp.getCodec()).readValueAs({{{.}}}.class);
3637
match++;
3738
} catch (Exception e) {
3839
// deserialization failed, continue
3940
}
41+
4042
{{/oneOf}}
4143
if (match == 1) {
4244
{{classname}} ret = new {{classname}}();
@@ -59,8 +61,8 @@ public class {{classname}} extends AbstractOpenApiSchema{{#vendorExtensions.x-im
5961
super("oneOf", {{#isNullable}}Boolean.TRUE{{/isNullable}}{{^isNullable}}Boolean.FALSE{{/isNullable}});
6062
setActualInstance(o);
6163
}
62-
{{/oneOf}}
6364

65+
{{/oneOf}}
6466
static {
6567
{{#oneOf}}
6668
schemas.put("{{{.}}}", new GenericType<{{{.}}}>() {

0 commit comments

Comments
 (0)