5

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

由于我使用的是 Jackson 混合插件,因此我尝试了 @JsonIgnore、@JsonGetter 和 @JsonProperty 注释的各种组合 - 均无济于事。如果该属性在序列化时可用,我会在反序列化中收到以下错误。我可以通过删除“组”属性来清理 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)

我如何告诉杰克逊忽略反序列化的只读属性?

谢谢,

迈克尔

4

3 回答 3

11

在无功而返的几个小时后,我终于找到了解决这个看似微不足道的问题的魔法组合。在 mixin 中,我必须创建这种注释组合:

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

难道没有更简单的方法来实现同样的目标吗?

迈克尔

于 2013-03-24T02:03:03.567 回答
3

我遇到过同样的问题。解决方案是给 getter 一个正确的名称:

List list...
setList(...)

是正确的,但我的 getter setProductList()产生了“setterLess”错误。将其更改为: setList(...)解决了问题

于 2013-08-18T08:42:16.063 回答
1

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

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

    private void setMyStr(String ignored) {}
}

setMyStr其设为私有可防止我意外尝试从我的代码中调用它,但 Jackson 仍然找到并调用它。杰克逊几乎不知道 - 或关心 - 调用它没有任何作用。

于 2014-01-03T22:26:28.030 回答