Heim > Java > StackOverflowError-Problem in der Spring Boot-Anwendung während der DTO-Serialisierung

StackOverflowError-Problem in der Spring Boot-Anwendung während der DTO-Serialisierung

王林
Freigeben: 2024-02-05 23:06:04
nach vorne
658 Leute haben es durchsucht
Frageninhalt

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.
Nach dem Login kopieren

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() +
        "}";
}
Nach dem Login kopieren

Postmapping-Anfragetext:

{
  // some other fields...
  "children": [
    {
      "key": "attribute412w",
      "value": "value3",
      "valuetype": "integer",
      "type": "response",
      "required": false,
      "enabled": true,
      "node": {
        "id": 26030
      }
    }
  ],
  // other fields...
}
Nach dem Login kopieren

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"
}
Nach dem Login kopieren

Frage:

  1. Wie ändere ich die tostring-Methode in der Klasse „nodeattributesdto“, um einen Stackoverflow-Fehler während der Serialisierung zu vermeiden?
  2. Gibt es bestimmte Jackson-Anmerkungen oder -Konfigurationen, die ich beim Umgang mit selbstreferenziellen Beziehungen in DTOs berücksichtigen sollte?

Umgebung: Spring-Boot-Version: 2.7.2 Java-Version: 17 Datenbank: postgresql

Ich habe es versucht:

  • Verschiedene Jackson-Anmerkungen (@jsonmanagedreference, @jsonbackreference)

Richtige Antwort


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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage