使用@JsonIdentityInfo时的null ID在反序列化期间失败

Rob*_*erd 6 jackson spring-boot

我正在使用杰克逊的@JsonIdentityInfo注释来生成漂亮的对象图.

我有以下对象(也是一个hibernate实体):

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, 
                   property="id")
public class MemberFieldDef implements Def
{
    @Id @GeneratedValue(generator="myGen")
    private String id;

   ....
}
Run Code Online (Sandbox Code Playgroud)

这个类在序列化期间工作正常,当时是对象图的一部分,但是当我想通过Jackson提交一个新的瞬态实体时,它还没有ID,并且

{
    "id":null,
    ...
}
Run Code Online (Sandbox Code Playgroud)

反序列化失败了:

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)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪显示Jackson没有使用常规的StringDeserializer - 它为文字null返回null - 但是使用的ObjectIdValueProperty似乎不允许空值.

是否有瞬态对象的解决方案?

Leo*_*zes 1

我们使用此处提供的解决方案修复了该问题,使用JsonInclude

@JsonInclude(Include.NON_NULL)
public class Shop {
    //...
}
Run Code Online (Sandbox Code Playgroud)

希望它也适合您!