Maison  >  Article  >  Problème StackOverflowError dans l'application Spring Boot lors de la sérialisation DTO

Problème StackOverflowError dans l'application Spring Boot lors de la sérialisation DTO

王林
王林avant
2024-02-05 23:06:04556parcourir
Contenu de la question

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 :

  1. Comment modifier la méthode tostring dans la classe nodeattributesdto pour éviter les erreurs de stackoverflower lors de la sérialisation ?
  2. 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer