61 votes

Étrange exception Jackson déclenchée lors de la sérialisation d'un objet Hibernate

Jackson est en train de lancer une étrange exception que je ne sais pas comment le résoudre. Je suis en utilisant Spring, Hibernate et Jackson.

J'ai déjà considéré que le lazy-loading est à l'origine du problème, mais j'ai pris des mesures pour raconter Jackson ne PAS traiter diverses propriétés comme suit:

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

J'ai fait la même chose pour tous les autres Compteutilisateur sous-classes.

Voici l'exception levée:

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)

Des Suggestions sur comment je peux obtenir plus d'info pour voir ce qui cause cela? Quelqu'un sait comment résoudre ce problème?

EDIT: j'ai découvert que getHander() et autres*() méthodes existent sur l'objet proxy. GRR!! Est-il possible que je peux dire Jackson ne pas traiter quoi que ce soit sur le proxy, ou suis-je le sol? C'est vraiment bizarre, parce que la méthode que crache le JSON plante seulement dans certaines circonstances, ne pas tout le temps. Néanmoins, c'est en raison de l'obtenir*() sur l'objet proxy.

De côté: les Procurations sont le mal. Ils perturbent Jackson, equals() et de nombreuses autres parties de l'ordinaire de programmation Java. Je suis tenté de le fossé Hibernate tout à fait :/

71voto

Claes Mogren Points 918

J'ai eu un problème similaire avec le chargement différé via l'objet proxy hibernate. Pour contourner le problème en annotant la classe ayant des propriétés privées lazyloaded avec:

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

Je suppose que vous pouvez ajouter les propriétés de votre objet proxy qui cassent la sérialisation JSON à cette annotation.

Eviter la sérialisation de Jackson sur des objets paresseux non récupérés

38voto

skaffman Points 197885

Ce n'est pas idéal, mais vous pouvez désactiver la détection automatique des propriétés JSON par Jackson, en utilisant @JsonAutoDetect au niveau de la classe. Cela l’empêcherait d’essayer de gérer le truc Javassiste (et d’échouer).

Cela signifie que vous devez ensuite annoter manuellement chaque getter (avec @JsonProperty ), mais ce n'est pas nécessairement une mauvaise chose, car cela garde les choses explicites.

23voto

OhadR Points 1180

J'ai eu la même erreur, mais sans relation avec Hibernate. J'ai eu peur de toutes les suggestions effrayantes, ce qui me semble pertinent dans le cas d'Hibernate et de chargement paresseux ... Cependant, dans mon cas, j'ai eu l'erreur car dans une classe interne je n'avais pas de getters / setters, donc le BeanSerializer ne pouvait pas sérialiser les données...

L'ajout de getters et setters a résolu le problème.

9voto

StaxMan Points 34626

Pour ce que ça vaut, il y a le projet de module Jackson Hibernate qui vient de commencer, et qui devrait résoudre ce problème et, espérons-le, d'autres également. Le projet est lié au projet de Jackson, mais ne fait pas partie des sources principales. C'est principalement pour permettre un processus de publication plus simple; Jackson 1.7 sera nécessaire à l’introduction de l’API de module.

6voto

Jaishankararam Points 61

J'ai eu le même problème. Voyez si vous utilisez hibernatesession.load() . Si c'est le cas, essayez de convertir en hibernatesession.get() . Cela a résolu mon problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X