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<T extends Number> { public abstract void setNumber(T value); } static class NumberBean extends BaseNumberBean<Long> { long _number; @Override public void setNumber(Long value) { _number = value.intValue(); } } /** * Very simple bean class */ static class SimpleBean { public int x; } static class Wrapper<T> { 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<SimpleBean> result = mapper.readValue ("{\"value\": { \"x\" : 13 } }", new TypeReference<Wrapper<SimpleBean>>() { }); 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<SimpleBean> result = mapper.readValue ("[{\"value\": [{ \"x\" : 13 }] }]", new TypeReference<Wrapper<SimpleBean>>() { }); 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); } /** * Unit test for verifying that we can use different * type bindings for individual generic types; * problem with [JACKSON-190] */ public void testMultipleWrappers() throws Exception { ObjectMapper mapper = new ObjectMapper(); // First, numeric wrapper Wrapper<Boolean> result = mapper.readValue ("{\"value\": true}", new TypeReference<Wrapper<Boolean>>() { }); assertEquals(new Wrapper<Boolean>(Boolean.TRUE), result); // Then string one Wrapper<String> result2 = mapper.readValue ("{\"value\": \"abc\"}", new TypeReference<Wrapper<String>>() { }); assertEquals(new Wrapper<String>("abc"), result2); // And then number Wrapper<Long> result3 = mapper.readValue ("{\"value\": 7}", new TypeReference<Wrapper<Long>>() { }); assertEquals(new Wrapper<Long>(7L), result3); } //[Issue#381] public void testMultipleWrappersSingleValueArray() throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS); // First, numeric wrapper Wrapper<Boolean> result = mapper.readValue ("[{\"value\": [true]}]", new TypeReference<Wrapper<Boolean>>() { }); assertEquals(new Wrapper<Boolean>(Boolean.TRUE), result); // Then string one Wrapper<String> result2 = mapper.readValue ("[{\"value\": [\"abc\"]}]", new TypeReference<Wrapper<String>>() { }); assertEquals(new Wrapper<String>("abc"), result2); // And then number Wrapper<Long> result3 = mapper.readValue ("[{\"value\": [7]}]", new TypeReference<Wrapper<Long>>() { }); assertEquals(new Wrapper<Long>(7L), result3); } /** * Unit test for verifying fix to [JACKSON-109]. */ public void testArrayOfGenericWrappers() throws Exception { ObjectMapper mapper = new ObjectMapper(); Wrapper<SimpleBean>[] result = mapper.readValue ("[ {\"value\": { \"x\" : 9 } } ]", new TypeReference<Wrapper<SimpleBean>[]>() { }); assertNotNull(result); assertEquals(Wrapper[].class, result.getClass()); assertEquals(1, result.length); Wrapper<SimpleBean> 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<SimpleBean>[] result = mapper.readValue ("[ {\"value\": [ { \"x\" : [ 9 ] } ] } ]", new TypeReference<Wrapper<SimpleBean>[]>() { }); assertNotNull(result); assertEquals(Wrapper[].class, result.getClass()); assertEquals(1, result.length); Wrapper<SimpleBean> elem = result[0]; Object contents = elem.value; assertNotNull(contents); assertEquals(SimpleBean.class, contents.getClass()); SimpleBean bean = (SimpleBean) contents; assertEquals(9, bean.x); } }