2016-10-21 33 views
0

我已经发布了类似的东西,但我仍然试图解决我的问题。Jackson mixin没有被称为

感谢您与我的关系。

这样看来,杰克逊并没有叫一个mixin,因为它应该,我不知道为什么。

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

为什么不是我的工作混入?

这里的混入:

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); 

错误:

public class ElementMixin { 

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

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

以下是我与映射器注册它

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of fhir.Element, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information at [Source: [email protected]; line: 1, column: 1] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:255) at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1007) at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:150) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3807) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2844) at gov.nist.forecast.fhir.resources.IndexResourceTest.testParametersJSON(IndexResourceTest.java:173)

回答

0

混入仅关联注释;他们不能也不会添加任何字段或方法 - 不会添加字节码生成或操作。因此,尽管您可以添加注释以指示已存在于目标中的方法(包括静态工厂方法),但混入中定义的任何内容(除了注释)都不会被调用或使用。

+0

不确定“关联注释”是什么意思。 –

+0

我不相信我正在添加任何字段或方法。我想要的只是每次看到注册界面时,杰克逊都会调用相应的工厂方法(而不是构造函数)。我有646这些在第三方库不能改变。根据这篇文章,它应该工作[链接] http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html [链接] –

+0

@GeoffryRoberts所以目标类有匹配的工厂方法?如果是这样,那应该起作用。我认为你期望在调入类中调用静态方法,这不会发生在我的解释中 - 混合类不用于AT ALL,除了检查它的注释之外,“添加”那些与任何目标类有。关于“关联注释”: – StaxMan