【发布时间】: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)
【问题讨论】: