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 :
Environnement : Version de démarrage à ressort : 2.7.2 version java : 17 Base de données : postgresql
J'ai essayé :
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!