Problème StackOverflowError dans l'application Spring Boot lors de la sérialisation DTO
Je reçois stackoverflowerror dans l'application Spring Boot lorsque j'essaie de sérialiser la classe dto (nodeattributesdto) avec une relation auto-référentielle. L'erreur se produit lors de l'exécution de la méthode tostring dans la classe dto.
nodeattributes.java :
// relevant parts of nodeattributes.java @onetomany(mappedby = "parent") @cache(usage = cacheconcurrencystrategy.read_write) @jsonignoreproperties(value = { "children", "parent", "node" }, allowsetters = true) private set<nodeattributes> children ; @manytoone @jsonignoreproperties(value = { "children", "parent", "node" }, allowsetters = true) private nodeattributes parent; // other fields, getters, setters, etc.
nodeattributesdto.java :
// relevant parts of nodeattributesdto.java private set<nodeattributesdto> children; private nodeattributesdto parent; // getters, setters, and other methods... @override public string tostring() { return "nodeattributesdto{" + "id=" + getid() + // other fields... ", parent=" + getparent() + ", children=" + getchildren() + ", node=" + getnode() + "}"; }
texte de demande de postmapping :
{ // some other fields... "children": [ { "key": "attribute412w", "value": "value3", "valuetype": "integer", "type": "response", "required": false, "enabled": true, "node": { "id": 26030 } } ], // other fields... }
Erreur :
{ "type": "https://www.jhipster.tech/problem/problem-with-message", "title": "Internal Server Error", "status": 500, "detail": "Handler dispatch failed; nested exception is java.lang.StackOverflowError", "path": "/api/node-attributes", "message": "error.http.500" }
Question :
- Comment modifier la méthode tostring dans la classe nodeattributesdto pour éviter les erreurs de stackoverflower lors de la sérialisation ?
- Y a-t-il des annotations ou des configurations Jackson spécifiques que je devrais prendre en compte lorsque je traite des relations autoréférentielles dans les dtos ?
Environnement : Version de démarrage à ressort : 2.7.2 version java : 17 Base de données : postgresql
J'ai essayé :
- Différentes annotations Jackson (@jsonmanagedreference, @jsonbackreference)
Réponse correcte
Je crois que votre confusion est que toString ne contrôle pas le marshalling dans Spring Boot.
Si vous souhaitez enregistrer cet objet avec une erreur standard via System.err.println(), il utilisera toString.
Il semble que votre toString essaie essentiellement d'être un vidage récursif de données, mais ce n'est pas correct. Je pense que c'est juste du Java/CS de base.
Dans toString, vous pouvez simplement imprimer les données du nœud actuel, puis appeler toString(delagate) sur tous les nœuds enfants. Cela devrait être possible de le faire. Je pense qu'en général, vous n'avez pas besoin de références arrière (pour toString) puisque vous commencerez par le haut de "l'arbre".
Le marshaller inspecte l'objet et utilise la réflexion pour composer une représentation sérialisée. Comme vous l'avez remarqué, il respectera certaines annotations. Par exemple @JsonIgnore.
Voir : Comment ignorer les réponses de champ en json ?
Il y a beaucoup de bonnes informations ici : https://www.php.cn/link/ffe4a40fecc90fa1120088e704712fb2
Il pourrait également être utile de créer un service web simple en dehors d'un outil de génération de code (comme jhipster) pour comprendre ce qui se passe en coulisses et ainsi avoir un meilleur contrôle sur la génération.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

Version crackée d'EditPlus en chinois
Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

MinGW - GNU minimaliste pour Windows
Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.