2016-10-21 35 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