2013-03-22 1298 views
3

在基於CXF的REST層中我使用Jackson對Groovy對象進行了分隔/反序列化。我正在經歷的問題是反序列化一個沒有setter方法的屬性。有一個域對象儀表板,getGroups()方法返回一個Group對象列表。序列化後,該對象通過「group」屬性正確轉換爲JSON。當我從JavaScript發送對象進行更新時,JSON仍然具有「組」屬性。由於屬性在域對象上是隻讀的,我想在反序列化JSON時忽略「group」屬性。使用Jackson反序列化只讀屬性出錯

由於我使用的是Jackson混合插件,我嘗試過@JsonIgnore,@JsonGetter和@JsonProperty註釋的各種組合,所有都無濟於事。如果該屬性在序列化後可用,則在反序列化中出現以下錯誤。我可以通過刪除「group」屬性來清理JavaScript中的JSON對象,我想找到一個服務器端解決方案。

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Problem deserializing 'setterless' property 'groups': get method returned null (through reference chain: org.ozoneplatform.commons.server.domain.model.DashboardTemplate["groups"]) 
at com.fasterxml.jackson.databind.deser.impl.SetterlessProperty.deserializeAndSet(SetterlessProperty.java:114) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:198) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:577) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:393) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:289) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) 
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1169) 
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:625) 
at com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:448) 
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1038) 
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:614) 
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:578) 
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238) 

我該如何告訴傑克遜忽略反序列化的只讀屬性?

謝謝

邁克爾

回答

9

許多徒勞小時後,我終於找到魔法的神奇組合,解決這樣一個看似微不足道的問題。在混入我不得不創建註釋的結合:

@JsonIgnore 
abstract Set<Group> groups 

@JsonProperty 
abstract Set<Group> getGroups() 

@JsonIgnore 
abstract void setGroups(Set<Group> groups) 

最重要的是我有兩個配置參數添加到ObjectMapper:

mapper.configure(MapperFeature.USE_GETTERS_AS_SETTERS, false) 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

是不是有一個更簡單的方法來實現一樣?

Michael

+0

不,也根據這個要點:https://gist.github.com/thurloat/2510887這似乎是唯一的方法 – for3st 2013-11-20 12:19:10

+0

如何爲setGroups提供一個虛擬實現什麼也不做? – jsh 2015-04-10 20:02:02

1

我有同樣的問題。解決方案是給吸了正確的名稱:

List list... 
setList(...) 

是正確的,但我的吸氣劑 setProductList()該公司生產的「setterLess」的錯誤。將其更改爲: setList(...)解決了這個問題

1

我只是碰到了同樣的問題,我的解決方案是創建一個私有的,無操作二傳手:

public class MyFoo { 
    public String getMyStr() { 
     return "hello, world"; 
    } 

    private void setMyStr(String ignored) {} 
} 

製作setMyStr私人使我意外地試圖從我的代碼中調用它,但Jackson仍然找到它並調用它。傑克遜不知道 - 或者小心 - 它援引它什麼都不做。