首頁 >Java >DTO 序列化期間 Spring Boot 應用程式中出現 StackOverflowError 問題

DTO 序列化期間 Spring Boot 應用程式中出現 StackOverflowError 問題

王林
王林轉載
2024-02-05 23:06:04630瀏覽
問題內容

當我嘗試序列化具有自引用關係的 dto 類別 (nodeattributesdto) 時,我在 spring boot 應用程式中遇到 stackoverflowerror。該錯誤發生在執行dto類別中的tostring方法期間。

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 請求內文:

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

錯誤:

{
    "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"
}

問題:

  1. 如何修改 nodeattributesdto 類別中的 tostring 方法以避免序列化期間出現 stackoverflowerror?
  2. 在處理 dto 中的自引用關係時,我是否應該考慮特定的 jackson 註解或配置?

環境: 春季啟動版本:2.7.2 java版本:17 資料庫:postgresql

#我已經嘗試過:

  • 不同的 jackson 註釋(@jsonmanagedreference、@jsonbackreference)

正確答案


我相信您的困惑是 toString 不控制 Spring Boot 中的編組。

如果您要透過 System.err.println() 記錄該物件以表示標準錯誤,它將使用該 toString。

似乎您的 toString 本質上是試圖成為資料的遞歸轉儲,但並不正確。我認為這只是基本的 Java/CS。

在toString中,您可以只列印目前節點的數據,然後對所有子節點呼叫toString(delagate)。應該可以做到這一點。我認為一般情況下您不需要反向引用(對於 toString),因為您將從“樹”的頂部開始。

編組器檢查物件並使用反射來組成序列化表示。正如您所注意到的,它將遵守某些註釋。例如@JsonIgnore。

請參閱:如何忽略 json 中的欄位回應?

這裡有很多好資訊:https://www.php.cn/link/ffe4a40fecc90fa1120088e704712fb2

它還可能有助於在程式碼生成工具(如 jhipster)之外創建一個簡單的 Web 服務,以了解幕後發生的情況,從而更好地控制生成。

以上是DTO 序列化期間 Spring Boot 應用程式中出現 StackOverflowError 問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除