Domanda

Jackson sta gettando un'eccezione strano che non so come risolvere. Sto utilizzando Spring, Hibernate e Jackson.

Ho già considerato che lazy-caricamento è la causa del problema, ma mi hanno preso misure per raccontare Jackson di non processare varie proprietà come segue:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}

Ho fatto la stessa cosa per tutti gli altri sottoclassi UserAccount pure.

Ecco l'eccezione di essere gettato:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"])
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

Suggerimenti su come posso ottenere maggiori informazioni per vedere che cosa sta causando questo? Qualcuno sa come risolvere il problema?

Modifica ho scoperto che getHander () e esistono altri get * () i metodi sull'oggetto proxy. GRR !! C'è un modo posso dire Jackson di non processo nulla sul proxy, o sto SOL? Questo è davvero strano perché il metodo che sputa fuori il JSON si blocca solo in determinate circostanze, non tutto il tempo. Tuttavia, è a causa della get * () metodi sull'oggetto proxy.

A parte: I proxy sono il male. Essi disturbare Jackson, equals () e molte altre parti della regolare programmazione Java. Sono tentato di abbandonare del tutto Hibernate: /

È stato utile?

Soluzione

Non è l'ideale, ma si può disattivare il rilevamento automatico di Jackson di proprietà JSON, utilizzando @JsonAutoDetect a livello di classe. Ciò eviterebbe che dal tentativo di gestire la roba Javassist (e non).

Questo significa che è quindi necessario annotare ogni getter manualmente (con @JsonProperty), ma questo non è necessariamente una cosa negativa, dal momento che mantiene le cose esplicito.

Altri suggerimenti

Ho avuto un problema simile con caricamento pigro tramite l'oggetto proxy di ibernazione. Ha ottenuto intorno ad esso annotando la classe aver lazyloaded proprietà private con:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

Presumo è possibile aggiungere le proprietà sull'oggetto proxy che rompe la serializzazione JSON a quella annotazione.

Evitare Jackson serializzazione su oggetti pigri non recuperati

ho ottenuto lo stesso errore, ma senza alcun rapporto con Hibernate. Ho avuto paura qui da tutti i suggerimenti spaventose, che credo rilevanti in caso di Hibernate e lazy loading ... Tuttavia, nel mio caso ho ottenuto l'errore dal momento che in una classe interna non avevo getter / setter, in modo che il BeanSerializer non poteva serializzare i dati ...

getter e setter Aggiunta risolto il problema.

Per quel che vale, non v'è Jackson Hibernate modulo progetto che è appena iniziato, e che dovrebbe risolvere questo problema e, auspicabilmente, altri pure. Il progetto è legato al progetto di Jackson, pur non facendo parte della fonte principale. Ciò è in gran parte per consentire processo di rilascio più semplice; richiederà Jackson 1.7 in quanto questo è quando viene introdotta modulo API.

Ho avuto lo stesso problema. Vedere se si utilizza hibernatesession.load(). In tal caso, provare la conversione in hibernatesession.get(). Ciò ha risolto il mio problema.

Ho avuto lo stesso messaggio di errore da @RestController di primavera. La mia classe controller resto stava usando classe JpaRepository di primavera e sostituendo il metodo repository.getOne(id) chiamata con il problema repository.findOne(id) era andato.

È possibile utilizzare il modulo jackson-tipo di dato-ibernazione per risolvere questo problema. Esso funziona per me. di riferimento: https://github.com/FasterXML/jackson-datatype-hibernate

Simile ad altre risposte, il problema per me stava dichiarando una relazione molti-a-uno colonna per fare il recupero pigro. Commutazione di recupero ansiosi risolto il problema. Prima:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.LAZY)

Dopo:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.EAGER)

Si potrebbe usare @JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" }) annotazione sulla tua classe "direttore"

È possibile aggiungere un mixin Jackson Object.class per sempre ignorare le proprietà hibernate-correlate. Se si utilizza Primavera Boot mettere questo nella classe di applicazione:

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
    b.mixIn(Object.class, IgnoreHibernatePropertiesInJackson.class);
    return b;
}


@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private abstract class IgnoreHibernatePropertiesInJackson{ }

Sono nuovo di Jackson API, quando ho ricevuto la "org.codehaus.jackson.map.JsonMappingException: No serializer trovato per la classe com.company.project.yourclass", ho aggiunto il getter e setter per com.company. project.yourclass, che mi ha aiutato a utilizzare l'oggetto mapper del ObjectMapper di scrivere l'oggetto Java in un file flat.

I affrontato lo stesso problema e 'davvero strano che lo stesso codice funziona in alcuni casi, mentre non è riuscito in alcuni casi casuali.

I got it risolto semplicemente assicurandosi della corretta setter / getter (Assicurandosi la sensibilità caso)

Ho provato @JsonDetect e

@JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" })

Nessuno di loro ha lavorato per me. Utilizzando un modulo di terze parti sembrava un sacco di lavoro per me. Così ho appena provato a fare una chiamata get di alcuna proprietà dell'oggetto pigro prima di passare alla jackson per serlization. Il codice di lavoro snippet sembrava qualcosa di simile:

@RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8")
    @ResponseBody
    @Transactional
    public Account authenticate(Principal principal) {
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal;
        LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal();
        User user = userRepository.findOne(loggedInUserDetails.getUserId());
        Account account = user.getAccount();
        account.getFullName();      //Since, account is lazy giving it directly to jackson for serlization didn't worked & hence, this quick-fix.
        return account;
    }

Inoltre è possibile rendere il vostro oggetto direttore del dominio finale. Non è la soluzione perfetta, ma a prevenire la creazione di proxy-sottoclasse di voi classe di dominio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top