2015-06-08 17 views
5

我正在使用Jackson的@JsonIdentityInfo註釋來生成漂亮的對象圖。null當使用@JsonIdentityInfo時的ID在反序列化期間失敗

我有以下對象(這是一個Hibernate實體也):

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

    .... 
} 

該類序列化過程中正常工作,對象圖的時候一部分,但是當我想提出一個新的,臨時實體通過傑克遜,其不具有ID還與具有

{ 
    "id":null, 
    ... 
} 

反序列化失敗:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of VALUE_NULL token 
at [Source: [email protected]; 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) 

Stacktrace顯示Jackson沒有使用常規的StringDeserializer--它對null的返回值爲空 - 但使用的是ObjectIdValueProperty,它似乎不允許空值。

是否有解決瞬態物體的問題?

+0

嗨!你(有沒有)找到任何解決方案? – LeoLozes

+0

只有發送一個已知的佔位符,如「NO_ID」或-1,才能在持續存在之前被刪除的電線....不是最好的:/ –

回答

1

我們固定它使用提供here的解決方案,使用JsonInclude

@JsonInclude(Include.NON_NULL) 
public class Shop { 
    //... 
} 

希望它爲你的!

0

我知道這個人是個問題,但我可以通過編碼吸氣劑來解決這個問題是返回目標對象的類似:

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

此外,還要爲空確保您的equals /的hashCode賬戶如果您使用ID作爲hashCode的一部分,則返回值。