Ich erhalte einen Stackoverflow-Fehler in der Spring-Boot-Anwendung, wenn ich versuche, die DTO-Klasse (nodeattributesdto) mit einer selbstreferenziellen Beziehung zu serialisieren. Der Fehler tritt während der Ausführung der tostring-Methode in der dto-Klasse auf.
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() + "}"; }
Postmapping-Anfragetext:
{ // some other fields... "children": [ { "key": "attribute412w", "value": "value3", "valuetype": "integer", "type": "response", "required": false, "enabled": true, "node": { "id": 26030 } } ], // other fields... }
Fehler:
{ "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" }
Frage:
Umgebung: Spring-Boot-Version: 2.7.2 Java-Version: 17 Datenbank: postgresql
Ich habe es versucht:
Ich glaube, Ihre Verwirrung besteht darin, dass toString das Marshalling in Spring Boot nicht steuert.
Wenn Sie dieses Objekt über System.err.println() im Standardfehler protokollieren möchten, verwendet es den toString.
Es scheint, als ob Ihr toString im Wesentlichen versucht, ein rekursiver Datenspeicherauszug zu sein, aber das ist nicht korrekt. Ich denke, es ist nur einfaches Java/CS.
In toString können Sie einfach die Daten des aktuellen Knotens drucken und dann toString(delagate) für alle untergeordneten Knoten aufrufen. Dies sollte möglich sein. Ich denke, im Allgemeinen benötigen Sie keine Rückverweise (für toString), da Sie oben im „Baum“ beginnen.
Der Marshaller untersucht das Objekt und erstellt mithilfe der Reflexion eine serialisierte Darstellung. Wie Sie bemerkt haben, werden bestimmte Anmerkungen berücksichtigt. Zum Beispiel @JsonIgnore.
Siehe: Wie ignoriere ich Feldantworten in JSON?
Hier gibt es viele gute Informationen: https://www.php.cn/link/ffe4a40fecc90fa1120088e704712fb2
Es könnte auch hilfreich sein, einen einfachen Webdienst außerhalb eines Codegenerierungstools (wie jhipster) zu erstellen, um zu verstehen, was hinter den Kulissen vor sich geht, und so eine bessere Kontrolle über die Generierung zu haben.
Das obige ist der detaillierte Inhalt vonStackOverflowError-Problem in der Spring Boot-Anwendung während der DTO-Serialisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!