package com.fasterxml.jackson.databind.deser.inject; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; public class TestInjectables extends BaseMapTest { static class InjectedBean { @JacksonInject protected String stuff; @JacksonInject("myId") protected String otherStuff; protected long third; public int value; @JacksonInject public void injectThird(long v) { third = v; } } static class CtorBean { protected String name; protected int age; public CtorBean(@JacksonInject String n, @JsonProperty("age") int a) { name = n; age = a; } } static class CtorBean2 { protected String name; protected Integer age; public CtorBean2(@JacksonInject String n, @JacksonInject("number") Integer a) { name = n; age = a; } } static class IssueGH471Bean { protected final Object constructorInjected; protected final String constructorValue; @JacksonInject("field_injected") protected Object fieldInjected; @JsonProperty("field_value") protected String fieldValue; protected Object methodInjected; protected String methodValue; public int x; @JsonCreator private IssueGH471Bean(@JacksonInject("constructor_injected") Object constructorInjected, @JsonProperty("constructor_value") String constructorValue) { this.constructorInjected = constructorInjected; this.constructorValue = constructorValue; } @JacksonInject("method_injected") private void setMethodInjected(Object methodInjected) { this.methodInjected = methodInjected; } @JsonProperty("method_value") public void setMethodValue(String methodValue) { this.methodValue = methodValue; } } // [databind#77] static class TransientBean { @JacksonInject("transient") transient Object injected; public int value; } /* /********************************************************** /* Unit tests /********************************************************** */ private final ObjectMapper MAPPER = newObjectMapper(); public void testSimple() throws Exception { ObjectMapper mapper = newObjectMapper(); mapper.setInjectableValues(new InjectableValues.Std() .addValue(String.class, "stuffValue") .addValue("myId", "xyz") .addValue(Long.TYPE, Long.valueOf(37)) ); InjectedBean bean = mapper.readValue("{\"value\":3}", InjectedBean.class); assertEquals(3, bean.value); assertEquals("stuffValue", bean.stuff); assertEquals("xyz", bean.otherStuff); assertEquals(37L, bean.third); } public void testWithCtors() throws Exception { CtorBean bean = MAPPER.readerFor(CtorBean.class) .with(new InjectableValues.Std() .addValue(String.class, "Bubba")) .readValue("{\"age\":55}"); assertEquals(55, bean.age); assertEquals("Bubba", bean.name); } public void testTwoInjectablesViaCreator() throws Exception { CtorBean2 bean = MAPPER.readerFor(CtorBean2.class) .with(new InjectableValues.Std() .addValue(String.class, "Bob") .addValue("number", Integer.valueOf(13)) ).readValue("{ }"); assertEquals(Integer.valueOf(13), bean.age); assertEquals("Bob", bean.name); } public void testIssueGH471() throws Exception { final Object constructorInjected = "constructorInjected"; final Object methodInjected = "methodInjected"; final Object fieldInjected = "fieldInjected"; ObjectMapper mapper = newObjectMapper() .setInjectableValues(new InjectableValues.Std() .addValue("constructor_injected", constructorInjected) .addValue("method_injected", methodInjected) .addValue("field_injected", fieldInjected)); IssueGH471Bean bean = mapper.readValue("{\"x\":13,\"constructor_value\":\"constructor\",\"method_value\":\"method\",\"field_value\":\"field\"}", IssueGH471Bean.class); /* Assert *SAME* instance */ assertSame(constructorInjected, bean.constructorInjected); assertSame(methodInjected, bean.methodInjected); assertSame(fieldInjected, bean.fieldInjected); /* Check that basic properties still work (better safe than sorry) */ assertEquals("constructor", bean.constructorValue); assertEquals("method", bean.methodValue); assertEquals("field", bean.fieldValue); assertEquals(13, bean.x); } // [databind#77] public void testTransientField() throws Exception { TransientBean bean = MAPPER.readerFor(TransientBean.class) .with(new InjectableValues.Std() .addValue("transient", "Injected!")) .readValue("{\"value\":28}"); assertEquals(28, bean.value); assertEquals("Injected!", bean.injected); } }