2013-03-22 1297 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仍然找到它并调用它。杰克逊不知道 - 或者小心 - 它援引它什么都不做。