Cxf 使用Jackson反序列化只读属性时出错

Cxf 使用Jackson反序列化只读属性时出错,cxf,jackson,deserialization,Cxf,Jackson,Deserialization,在基于CXF的REST层中,我使用Jackson对Groovy对象进行sealization/反序列化。我遇到的问题是反序列化没有setter方法的属性。有一个域对象仪表板,其getGroups()方法返回组对象列表。序列化后,此对象将正确转换为具有“group”属性的JSON。当我从JavaScript发送更新对象时,JSON仍然具有“group”属性。由于该属性在域对象上是只读的,所以在反序列化JSON时,我只想忽略“group”属性 因为我使用的是Jackson mix-ins,所以我尝试

在基于CXF的REST层中,我使用Jackson对Groovy对象进行sealization/反序列化。我遇到的问题是反序列化没有setter方法的属性。有一个域对象仪表板,其getGroups()方法返回组对象列表。序列化后,此对象将正确转换为具有“group”属性的JSON。当我从JavaScript发送更新对象时,JSON仍然具有“group”属性。由于该属性在域对象上是只读的,所以在反序列化JSON时,我只想忽略“group”属性

因为我使用的是Jackson mix-ins,所以我尝试了@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)
如何告诉Jackson在反序列化时忽略只读属性

谢谢,


迈克尔

在经历了许多毫无结果的小时后,我终于找到了魔法组合,解决了这个看似微不足道的问题。在mixin中,我必须创建这种注释组合:

@JsonIgnore
abstract Set<Group> groups

@JsonProperty
abstract Set<Group> getGroups()

@JsonIgnore
abstract void setGroups(Set<Group> groups)
难道没有更简单的方法来实现同样的目标吗


迈克尔

我也有同样的问题。解决方案是为getter提供正确的名称:

List list...
setList(...)
是正确的,但我的目标是
setProductList()
产生“无setterLess”错误。将其更改为:
setList(…)
解决了这个问题

我遇到了同样的问题,我的解决方案是创建一个私有的、无操作的setter:

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

    private void setMyStr(String ignored) {}
}

使
setMyStr
private可以防止我无意中试图从代码中调用它,但Jackson仍然会找到它并调用它。jackson几乎不知道——或者说不在乎——调用它不会产生任何作用。

不,根据这一要点:这似乎是唯一的方法,为不起作用的集合组提供一个虚拟实现如何?这实际上是最好的答案。我不得不将我的列表设置器更改为在setter方法的末尾包含
list
public class MyFoo {
    public String getMyStr() {
        return "hello, world";
    }

    private void setMyStr(String ignored) {}
}