aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java')
-rw-r--r--src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java
new file mode 100644
index 000000000..7b8ddf6fa
--- /dev/null
+++ b/src/test/java/com/fasterxml/jackson/databind/deser/builder/BuilderWithTypeParametersTest.java
@@ -0,0 +1,127 @@
+package com.fasterxml.jackson.databind.deser.builder;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.BaseMapTest;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+// [databind#921]: support infering type parameters from Builder
+public class BuilderWithTypeParametersTest
+ extends BaseMapTest
+{
+ public static class MyPOJO {
+ public String x;
+ public String y;
+
+ @JsonCreator
+ public MyPOJO(@JsonProperty("x") String x, @JsonProperty("y") String y) {
+ this.x = x;
+ this.y = y;
+ }
+ }
+
+ @JsonDeserialize(builder = MyGenericPOJO.Builder.class)
+ public static class MyGenericPOJO<T> {
+ private List<T> data;
+
+ private MyGenericPOJO(List<T> d) {
+ data = d;
+ }
+
+ public List<T> getData() {
+ return data;
+ }
+
+ // 28-Apr-2020, tatu: Note that as per [databind#921] the NAME of
+ // type variable here MUST match that of enclosing class. This has
+ // no semantic meaning to JDK or javac, but internally
+ // `MapperFeature.INFER_BUILDER_TYPE_BINDINGS` relies on this -- but
+ // can not really validate it. So user just has to rely on bit of
+ // black magic to use generic types with builders.
+ public static class Builder<T> {
+ private List<T> data;
+
+ public Builder<T> withData(List<T> d) {
+ data = d;
+ return this;
+ }
+
+ public MyGenericPOJO<T> build() {
+ return new MyGenericPOJO<T>(data);
+ }
+ }
+ }
+
+ public static class MyGenericPOJOWithCreator<T> {
+ private List<T> data;
+
+ private MyGenericPOJOWithCreator(List<T> d) {
+ data = d;
+ }
+
+ @JsonCreator
+ public static <T> MyGenericPOJOWithCreator<T> create(@JsonProperty("data") List<T> data) {
+ return new MyGenericPOJOWithCreator.Builder<T>().withData(data).build();
+ }
+
+ public List<T> getData() {
+ return data;
+ }
+
+ public static class Builder<T> {
+ private List<T> data;
+
+ public Builder<T> withData(List<T> d) {
+ data = d;
+ return this;
+ }
+
+ public MyGenericPOJOWithCreator<T> build() {
+ return new MyGenericPOJOWithCreator<T>(data);
+ }
+ }
+ }
+
+ public void testWithBuilderInferringBindings() throws Exception {
+ final ObjectMapper mapper = jsonMapperBuilder()
+ .enable(MapperFeature.INFER_BUILDER_TYPE_BINDINGS)
+ .build();
+ final String json = aposToQuotes("{ 'data': [ { 'x': 'x', 'y': 'y' } ] }");
+ final MyGenericPOJO<MyPOJO> deserialized =
+ mapper.readValue(json, new TypeReference<MyGenericPOJO<MyPOJO>>() {});
+ assertEquals(1, deserialized.data.size());
+ Object ob = deserialized.data.get(0);
+ assertNotNull(ob);
+ assertEquals(MyPOJO.class, ob.getClass());
+ }
+
+ public void testWithBuilderWithoutInferringBindings() throws Exception {
+ final ObjectMapper mapper = jsonMapperBuilder()
+ .disable(MapperFeature.INFER_BUILDER_TYPE_BINDINGS)
+ .build();
+ final String json = aposToQuotes("{ 'data': [ { 'x': 'x', 'y': 'y' } ] }");
+ final MyGenericPOJO<MyPOJO> deserialized =
+ mapper.readValue(json, new TypeReference<MyGenericPOJO<MyPOJO>>() {});
+ assertEquals(1, deserialized.data.size());
+ Object ob = deserialized.data.get(0);
+ assertNotNull(ob);
+ assertEquals(LinkedHashMap.class, ob.getClass());
+ }
+
+ public void testWithCreator() throws Exception {
+ final ObjectMapper mapper = new ObjectMapper();
+ final String json = aposToQuotes("{ 'data': [ { 'x': 'x', 'y': 'y' } ] }");
+ final MyGenericPOJOWithCreator<MyPOJO> deserialized =
+ mapper.readValue(json,
+ new TypeReference<MyGenericPOJOWithCreator<MyPOJO>>() {});
+ assertEquals(1, deserialized.data.size());
+ Object ob = deserialized.data.get(0);
+ assertNotNull(ob);
+ assertEquals(MyPOJO.class, ob.getClass());
+ }
+ }