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

王林
王林nach vorne
2024-02-05 23:06:04631Durchsuche
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.

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:

  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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen