2015-06-08 26 views
5

Tôi đang sử dụng @JsonIdentityInfo chú thích của Jackson để tạo ra các đồ thị đối tượng tốt đẹp.rỗng ID khi sử dụng @JsonIdentityInfo Thất bại trong deserialization

tôi có các đối tượng sau đây (mà là một thực thể ngủ đông cũng):

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

    .... 
} 

Lớp này hoạt động tốt trong serialization, khi một phần của một đồ thị đối tượng, nhưng khi tôi muốn gửi một thực thể thoáng mới qua Jackson, mà không có một ID được nêu ra và có

{ 
    "id":null, 
    ... 
} 

Các deserialization không thành công với:

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

Các stacktrace cho thấy Jackson không được sử dụng thường xuyên StringDeserializer - trả về null cho một null đen - nhưng đang sử dụng ObjectIdValueProperty mà dường như không cho phép null.

Có một giải pháp cho các đối tượng thoáng qua?

+0

Xin chào! Bạn có (bất kỳ cơ hội nào) tìm ra giải pháp nào không? – LeoLozes

+0

Chỉ để gửi trình giữ chỗ đã biết, chẳng hạn như "NO_ID" hoặc -1 xuống dây bị xóa trước khi lưu giữ .... không phải là tốt nhất: / –

Trả lời

1

Chúng tôi cố định nó bằng cách sử dụng giải pháp cung cấp here, sử dụng JsonInclude:

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

Hy vọng nó sẽ làm việc cho bạn cũng!

0

Tôi biết đây là một trong câu hỏi, nhưng tôi đã có thể giải quyết vấn đề này bằng cách mã hóa các getter đó quay trở lại đối tượng mục tiêu đến một cái gì đó như:

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

Ngoài ra, hãy chắc chắn rằng bình đẳng của bạn/tài khoản hashCode for null các giá trị nếu bạn sử dụng ID như một phần của hashCode.

Các vấn đề liên quan