package com.fasterxml.jackson.databind.deser; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; public class TestGenerics extends BaseMapTest { static abstract class BaseNumberBean { public abstract void setNumber(T value); } static class NumberBean extends BaseNumberBean { long _number; @Override public void setNumber(Long value) { _number = value.intValue(); } } /** * Very simple bean class */ static class SimpleBean { public int x; } static class Wrapper { public T value; public Wrapper() { } public Wrapper(T v) { value = v; } @Override public boolean equals(Object o) { return (o instanceof Wrapper) && (((Wrapper) o).value.equals(value)); } } /* /*************************************************** /* Test cases /*************************************************** */ public void testSimpleNumberBean() throws Exception { ObjectMapper mapper = new ObjectMapper(); NumberBean result = mapper.readValue("{\"number\":17}", NumberBean.class); assertEquals(17, result._number); } /** * Unit test for verifying fix to [JACKSON-109]. */ public void testGenericWrapper() throws Exception { ObjectMapper mapper = new ObjectMapper(); Wrapper result = mapper.readValue ("{\"value\": { \"x\" : 13 } }", new TypeReference>() { }); assertNotNull(result); assertEquals(Wrapper.class, result.getClass()); Object contents = result.value; assertNotNull(contents); assertEquals(SimpleBean.class, contents.getClass()); SimpleBean bean = (SimpleBean) contents; assertEquals(13, bean.x); } public void testGenericWrapperWithSingleElementArray() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS); Wrapper result = mapper.readValue ("[{\"value\": [{ \"x\" : 13 }] }]", new TypeReference>() { }); assertNotNull(result); assertEquals(Wrapper.class, result.getClass()); Object contents = result.value; assertNotNull(contents); assertEquals(SimpleBean.class, contents.getClass()); SimpleBean bean = (SimpleBean) contents; assertEquals(13, bean.x); } // Test for verifying that we can use different // type bindings for individual generic types. public void testMultipleWrappers() throws Exception { ObjectMapper mapper = new ObjectMapper(); // First, numeric wrapper Wrapper result = mapper.readValue ("{\"value\": true}", new TypeReference>() { }); assertEquals(new Wrapper(Boolean.TRUE), result); // Then string one Wrapper result2 = mapper.readValue ("{\"value\": \"abc\"}", new TypeReference>() { }); assertEquals(new Wrapper("abc"), result2); // And then number Wrapper result3 = mapper.readValue ("{\"value\": 7}", new TypeReference>() { }); assertEquals(new Wrapper(7L), result3); } //[databind#381] public void testMultipleWrappersSingleValueArray() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS); // First, numeric wrapper Wrapper result = mapper.readValue ("[{\"value\": [true]}]", new TypeReference>() { }); assertEquals(new Wrapper(Boolean.TRUE), result); // Then string one Wrapper result2 = mapper.readValue ("[{\"value\": [\"abc\"]}]", new TypeReference>() { }); assertEquals(new Wrapper("abc"), result2); // And then number Wrapper result3 = mapper.readValue ("[{\"value\": [7]}]", new TypeReference>() { }); assertEquals(new Wrapper(7L), result3); } /** * Unit test for verifying fix to [JACKSON-109]. */ public void testArrayOfGenericWrappers() throws Exception { ObjectMapper mapper = new ObjectMapper(); Wrapper[] result = mapper.readValue ("[ {\"value\": { \"x\" : 9 } } ]", new TypeReference[]>() { }); assertNotNull(result); assertEquals(Wrapper[].class, result.getClass()); assertEquals(1, result.length); Wrapper elem = result[0]; Object contents = elem.value; assertNotNull(contents); assertEquals(SimpleBean.class, contents.getClass()); SimpleBean bean = (SimpleBean) contents; assertEquals(9, bean.x); } // [Issue#381] public void testArrayOfGenericWrappersSingleValueArray() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS); Wrapper[] result = mapper.readValue ("[ {\"value\": [ { \"x\" : [ 9 ] } ] } ]", new TypeReference[]>() { }); assertNotNull(result); assertEquals(Wrapper[].class, result.getClass()); assertEquals(1, result.length); Wrapper elem = result[0]; Object contents = elem.value; assertNotNull(contents); assertEquals(SimpleBean.class, contents.getClass()); SimpleBean bean = (SimpleBean) contents; assertEquals(9, bean.x); } }