Java 使用@JacksonInject和@JsonCreator将ObjectMapper注入反序列化对象

Java 使用@JacksonInject和@JsonCreator将ObjectMapper注入反序列化对象,java,json,serialization,jackson,deserialization,Java,Json,Serialization,Jackson,Deserialization,我一直在尝试使用@JacksonInject和@JsonCreator将ObjectMapper注入到Jackson反序列化对象中,但没有成功。看起来Jackson坚持注入的类是反序列化的。我用的是杰克逊2.6.1。顺便说一句,当在字段上使用@JsonProperty和@JacksonInject而不是使用@JsonCreator时,这是有效的。我做错什么了吗 我有以下测试代码: public class MyTest { @Test public void test_round

我一直在尝试使用@JacksonInject和@JsonCreator将ObjectMapper注入到Jackson反序列化对象中,但没有成功。看起来Jackson坚持注入的类是反序列化的。我用的是杰克逊2.6.1。顺便说一句,当在字段上使用@JsonProperty和@JacksonInject而不是使用@JsonCreator时,这是有效的。我做错什么了吗

我有以下测试代码:

public class MyTest {
    @Test
    public void test_roundtrip_shouldSucceed() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setInjectableValues(new InjectableValues.Std().addValue(ObjectMapper.class, mapper));

        MyObj original = new MyObj(mapper, 10);
        String serialized = mapper.writeValueAsString(original);
        System.out.println(serialized);
        MyObj returned = mapper.readValue(serialized, MyObj.class);

        assertEquals(original.val, returned.val);
    }

    public static class MyObj {
        private final ObjectMapper mapper;
        private final long val;

        @JsonCreator
        public MyObj(
                @JacksonInject("mapper") ObjectMapper mapper,
                @JsonProperty("val") long val) {
            this.mapper = mapper;
            this.val = val;
        }

        public long getVal() {
            return val;
        }
    }
}
我明白了:

{"val":10}

com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "config": com.fasterxml.jackson.databind.ObjectMapper#setConfig(1 params) vs com.fasterxml.jackson.databind.ObjectMapper#setConfig(1 params)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
    at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:428)
    at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.construct(PropertyBasedCreator.java:79)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:549)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:296)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:461)
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3804)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3698)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2714)
    at com.appdynamics.sim.controller.rest.machines.GenericConfigTest.test_roundtrip_shouldSucceed(GenericConfigTest.java:66)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.IllegalArgumentException: Conflicting setter definitions for property "config": com.fasterxml.jackson.databind.ObjectMapper#setConfig(1 params) vs com.fasterxml.jackson.databind.ObjectMapper#setConfig(1 params)
    at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:299)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.filterBeanProps(BeanDeserializerFactory.java:592)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:488)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:229)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:142)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
    ... 39 more

有解决办法吗?这正是我想要做的。我在ObjectMapper上使用了字段注释,而没有将其传递给构造函数。谢谢。我最终只使用了一个静态字段,因为在我的例子中,它都在同一个包中。我发现我不再把ObjectMapper看作是作为配置/IoC传递的服务,而更多的是一种内部服务。