【问题标题】:Jackson mixin not being called杰克逊 mixin 没有被调用
【发布时间】:2017-03-04 01:32:09
【问题描述】:

我已经发布了类似的内容,但我仍在努力解决我的问题。

感谢您对我的包容。

杰克逊似乎没有按应有的方式调用 mixin,我不知道为什么。

“元素”是一个接口而不是一个类。它通常使用静态工厂调用来实例化,如 mixin(下图)所示。我理解它的方式,当杰克逊看到接口时: Element.class 它应该查找 mixin 然后执行具有 @JsonCreator 注释的方法。这一切都没有发生。如果是,我会看到记录器的输出。相反,正如人们在错误消息(如下所示)中看到的那样,杰克逊试图将我的接口视为一个类并且不能。

为什么我的 mixin 不起作用?

这是混合:

 public class ElementMixin {

      private static Logger log = LoggerFactory.getLogger(ElementMixin.class);

        @JsonCreator
        public static Element create() {
            log.error("Element==>");
            return FhirFactory.eINSTANCE.createElement();
        }
       }

这是我使用映射器注册它的方法:

    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(Element.class, ElementMixin.class);

这是我的运行方式:

// Instantiate my interface, put some data in and serialize. 
Element ela = FhirFactory.eINSTANCE.createElement();
ela.setId("CBAEL");
StringWriter writer = new StringWriter();
mapper.writeValue(writer, ela);

// Now try to deserialize into a new instance.
StringReader reader = new StringReader(writer.toString());
Element elp = mapper.readValue(reader, Element.class);//Error thrown
assertNotNull(elp);

错误:

com.fasterxml.jackson.databind.JsonMappingException: 无法构造 fhir.Element 的实例,问题:抽象类型要么需要 映射到具体类型,具有自定义反序列化器,或被实例化 在 [来源: java.io.StringReader@4fe533ff;行:1,列:1] 在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:255) 在 com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1007) 在 com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:150) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3807) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2844) 在 gov.nist.forecast.fhir.resources.IndexResourceTest.testParametersJSON(IndexResourceTest.java:173)

【问题讨论】:

    标签: java json jackson mixins


    【解决方案1】:

    mix-ins 只关联注解;他们不能也不添加任何字段或方法——不添加字节码生成或操作。因此,虽然您可以添加注释以指示应该使用目标中已经存在的方法(包括静态工厂方法),但在 mix-in 中定义的任何内容(除了注释)都不会被调用或使用。

    【讨论】:

    • 不确定“关联注释”是什么意思。
    • 我不相信我正在添加任何字段或方法。我想要的只是让杰克逊在每次看到注册接口时调用适当的工厂方法(而不是构造函数)。我在无法更改的 3rd 方库中有 646 个。根据这篇文章,它应该可以工作 [link]cowtowncoder.com/blog/archives/2011/07/entry_457.html[link]
    • @GeoffryRoberts 所以目标类有匹配的工厂方法?如果是这样,那应该可以。我假设您期望调用混合类中的静态方法,根据我的解释,这不会发生 - 根本不使用混合类,除了检查它具有的注释,“添加”那些带有任何目标的注释类有。
    • 至于“关联注释”:来自混合类的注释被读取,并被杰克逊代码使用,就好像它们存在于目标类中一样。但是如果不重写类,就无法即时添加它们;它们仅与目标类相关联。我不知道你认为 mix-ins 有什么作用,但它们实际上只是给 Jackson 额外注释以考虑的一种方式。它不会添加方法、字段或其他任何内容。
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 2015-06-11
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多