Maison > Java > le corps du texte

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

王林
Libérer: 2024-02-05 23:06:04
avant
623 Les gens l'ont consulté
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.
Copier après la connexion

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() +
        "}";
}
Copier après la connexion

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...
}
Copier après la connexion

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"
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal