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

Mic*_*yak 5 cxf jackson deserialization

在我的基于CXF的REST层中,我使用Jackson来对Groovy对象进行seializing /反序列化.我遇到的问题涉及反序列化没有setter方法的属性.有一个域对象Dashboard,getGroups()方法返回一个Group对象列表.序列化后,此对象已正确转换为具有"group"属性的JSON.当我从JavaScript发送更新对象时,JSON仍然具有"group"属性.由于该属性在域对象上是只读的,因此我希望在反序列化JSON时忽略"group"属性.

由于我使用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)
Run Code Online (Sandbox Code Playgroud)

如何告诉Jackson忽略反序列化的只读属性?

谢谢,

迈克尔

Mic*_*yak 11

在经历了许多无效的工作之后,我终于找到了解决这个看似微不足道的问题的法术组合.在mixin中,我必须创建这种注释组合:

@JsonIgnore
abstract Set<Group> groups

@JsonProperty
abstract Set<Group> getGroups()

@JsonIgnore
abstract void setGroups(Set<Group> groups)
Run Code Online (Sandbox Code Playgroud)

最重要的是,我必须向ObjectMapper添加两个配置参数:

mapper.configure(MapperFeature.USE_GETTERS_AS_SETTERS, false)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
Run Code Online (Sandbox Code Playgroud)

是否有更简单的方法来实现相同的目标?

迈克尔