Paresseux Loadng erreur dans sérialiseur JSON
J'ai ce genre de @OneToOne Hibernate relation
public class Address implements Serializable {
private String id;
private String city;
private String country;
//setter getters ommitted
}
public class Student implements Serializable {
private String id;
private String firstName;
private String lastName;
private Address address;
}
adresse de l'Élément est mappé comme des PARESSEUX.
Maintenant, je veux aller chercher de l'utilisateur et de l'adresse à l'aide de
session.load(Student.class,id);
Dans mon daoService.
Puis-je la retourner comme JSON de mon contrôleur Spring MVC:
@RequestMapping(value="/getStudent.do",method=RequestMethod.POST)
@ResponseBody
public Student getStudent(@RequestParam("studentId") String id){
Student student = daoService.getStudent(id);
return student;
}
Malheureusement, il ne fonctionne pas en raison de Paresseux clasees et j'échoue avec:
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: com.vanilla.objects.Student_$$_javassist_1["address"]->com.vanilla.objects.Address_$$_javassist_0["handler"])
at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
Je ne l'utilisation de OpenSessionInViewInterceptor et il fonctionne très bien.
Je comprends que je peux l'utilisateur left join requête HQL et de récupérer de l'étudiant et l'adresse de cette façon, et de résoudre le problème. Je comprends aussi que le changement de rapport AVIDES de les résoudre.
Mais comment puis-je sérialiser en JSON paresseux classes en utilisant la norme jackson message convertisseur de cause j'ai ajouté à mon fichier XML.
OriginalL'auteur danny.lesnik | 2011-06-08
Vous devez vous connecter pour publier un commentaire.
La solution la plus simple: Ne pas sérialiser des entités, de la Valeur d'usage des Objets.
Si ce n'est pas une option pour vous, assurez-vous que l'entité Objet est détaché.
Avec JPA (2), vous pouvez utiliser
EntityManager.détacher(entité)
, avec la plaine de mise en veille prolongée l'équivalent estSession.expulser(entité)
.c'est ce que j'avait peur, mais elle valait la peine d'essayer. Ensuite, utiliser des objets de valeur 🙂
pourriez-vous nous expliquer ce qu'entendez-vous par des Objets de Valeur? 🙂
href="http://en.wikipedia.org/wiki/Data_transfer_object" >en.wikipedia.org/wiki/Data_transfer_object
comment cela devrait résoudre le problème tout en utilisant spring data jpa, vous n'avez pas un accès direct à l'entitymanager?
OriginalL'auteur Sean Patrick Floyd
Une fois que j'écris un processeur pour gérer cela, mais maintenant il est facile de résoudre ce problème en utilisant la jackson hibernate module.
OriginalL'auteur NewBee
À l'intérieur de votre méthode DAO ajouter
Hibernate.initialize(<your getter method>);
pour résoudre ce problème.Essayer comme ci-dessus.
Si vous avez près de 60-70 connexes entité getters ou setters, que, probablement, montre une très mauvaise conception. Et la réponse a été fournie dans l'hypothèse que vous avez été coincé avec seulement quelques.
OriginalL'auteur bhagyas
Il y a une autre option qui permet de résoudre votre problèmes. Vous pouvez ajouter ce filtre en web.xml
Le problème est que les entités sont chargées de paresseux et de sérialisation qui se passe avant de se charger entièrement.
il est déjà à l'aide de l'intercepteur.
OriginalL'auteur Mite Mitreski
Tout d'abord, je ne conseille pas d'utiliser DTO/Objet de Valeur seulement pour résoudre ce problème.
Vous pouvez trouver, il est facile au début mais à chaque nouveau développement/modifier le code en double des moyens de faire deux fois les modifications à chaque fois... sinon les bugs.
Je ne veux pas dire que la VO ou de la DTO sont mauvaises odeurs, mais vous devez les utiliser pour des raisons qu'ils sont conçus (comme l'offre d'un contenu ou de la structure qui diffère selon couches logiques ou de résoudre l'insoluble problème de sérialisation).
Si vous avoir un propre et efficace pour résoudre le problème de sérialisation sans VO/DTO et vous n'en avez pas besoin, ne les utilisez pas.
Et à ce sujet, il y a de nombreuses façons de résoudre le chargement paresseux question que vous utilisez Jackson avec les entités Hibernate.
En fait, la façon la plus simple est d'utiliser FasterXML/jackson-type de données-veille prolongée
Il fournit
Hibernate3Module/Hibernate4Module/Hibernate5Module
, les modules d'extension peuvent être enregistrés avecObjectMapper
de fournir un ensemble bien défini d'extensions liées à Hibernate spécificités.À faire ce travail, vous avez juste besoin d'ajouter la dépendance et à ajouter les
Jackson Module de disponibles au cours de traitements où elle est nécessaire.
Si vous utiliser Hibernate 3 :
Si vous utiliser Hibernate 4 :
Et donc pour...
Où
jackson.version.datatype
doit être le même pour l'Jackson version et la ackson-type de données d'extension.Si vous utilisez, vous pouvez utiliser le Printemps de Démarrage, il vous suffit de déclarer le module comme un haricot dans un
Configuration
classe ou dans laSpringBootApplication
classe et il sera automatiquement enregistré pour l'un de JacksonObjectMapper
créé.La
74.3 Personnaliser la Jackson ObjectMapper
Printemps de Démarrage, l'article précise que :Par exemple :
ou :
OriginalL'auteur davidxxx