使用@JsonIdentityInfo时出现空ID,在反序列化过程中失败。

6
我将使用Jackson的@JsonIdentityInfo注解来生成漂亮的对象图。
我有以下对象(也是Hibernate实体):
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, 
                   property="id")
public class MemberFieldDef implements Def
{
    @Id @GeneratedValue(generator="myGen")
    private String id;

   ....
}

这个类在序列化对象图的一部分时表现良好,但当我想通过Jackson提交一个新的、暂时的实体时,由于它还没有ID并且具有...
{
    "id":null,
    ...
}

反序列化操作失败,出现以下错误:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of VALUE_NULL token
 at [Source: java.io.PushbackInputStream@5950054d; line: 1, column: 2] (through reference chain: net._95point2.sarbase.cohort.entity.MemberFieldDef["id"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:762)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)
    at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)
    at com.fasterxml.jackson.databind.deser.impl.ObjectIdValueProperty.deserializeSetAndReturn(ObjectIdValueProperty.java:90)
    at com.fasterxml.jackson.databind.deser.impl.ObjectIdValueProperty.deserializeAndSet(ObjectIdValueProperty.java:82)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:306)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithObjectId(BeanDeserializerBase.java:1036)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:122)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2221)
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:205)

堆栈跟踪显示Jackson没有使用常规的StringDeserializer,该解析器对于字面上的null返回null,而是使用ObjectIdValueProperty,该属性似乎不允许null值。
对于临时对象,有解决方案吗?

嗨!你(无论如何)找到任何解决方案了吗? - Leo Lozes
只需在传输过程中发送一个已知的占位符,例如“NO_ID”或-1,该占位符在持久化之前被删除... 这不是最好的 :/ - Rob Shepherd
2个回答

1
我们使用提供的解决方案 这里,使用 JsonInclude 进行修复:
@JsonInclude(Include.NON_NULL)
public class Shop {
    //...
}

希望它对您也有用!

0

我知道这是一个问题,但我能够通过编写返回目标对象的getter来解决此问题,代码类似于:

    public MemberFieldDef getMemberFieldDef() {
       return (this.memberFieldDef == null || this.memberFieldDef.getId() == null)?null:this.memberFieldDef;
    }

此外,如果您将ID作为hashCode的一部分,请确保您的equals/hashCode考虑了null值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接