2015-06-08 7 views
5

Sto utilizzando l'annotazione di Jackson @JsonIdentityInfo per generare grafici di oggetti piacevoli.ID null quando si utilizza @JsonIdentityInfo Errore durante la deserializzazione

ho il seguente oggetto (che è un'entità Hibernate anche):

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

    .... 
} 

Questa classe funziona bene durante la serializzazione, quando una parte di un oggetto grafico, ma quando voglio presentare una nuova entità transitoria attraverso Jackson, che non ha un ID e ha ancora

{ 
    "id":null, 
    ... 
} 

La deserializzazione fallisce con:

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) 

Lo stacktrace mostra che Jackson non sta utilizzando il normale StringDeserializer - che restituisce null per un valore letterale null - ma utilizza lo ObjectIdValueProperty che sembra non consentire i valori nulli.

Esiste una soluzione per gli oggetti transitori?

+0

Ciao! Hai (per caso) trovato qualche soluzione? – LeoLozes

+0

Solo per inviare un segnaposto noto come "NO_ID" o -1 sul filo che viene eliminato prima di persistere .... non il migliore: / –

risposta

1

abbiamo fissato utilizzando la soluzione fornita here, utilizzando JsonInclude:

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

auguro che funziona per voi pure!

0

So che questo è domanda, ma ero in grado di risolvere questo problema codificando il getter che ha restituito oggetto di destinazione per il qualcosa di simile:

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

Inoltre, assicurarsi tuoi pari/account hashCode per nulla valori se usi l'ID come parte del codice hash.