當我嘗試序列化具有自引用關係的 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" }
問題:
環境: 春季啟動版本:2.7.2 java版本:17 資料庫:postgresql
#我已經嘗試過:
我相信您的困惑是 toString 不控制 Spring Boot 中的編組。
如果您要透過 System.err.println() 記錄該物件以表示標準錯誤,它將使用該 toString。
似乎您的 toString 本質上是試圖成為資料的遞歸轉儲,但並不正確。我認為這只是基本的 Java/CS。
在toString中,您可以只列印目前節點的數據,然後對所有子節點呼叫toString(delagate)。應該可以做到這一點。我認為一般情況下您不需要反向引用(對於 toString),因為您將從“樹”的頂部開始。
編組器檢查物件並使用反射來組成序列化表示。正如您所注意到的,它將遵守某些註釋。例如@JsonIgnore。
這裡有很多好資訊:https://www.php.cn/link/ffe4a40fecc90fa1120088e704712fb2
它還可能有助於在程式碼生成工具(如 jhipster)之外創建一個簡單的 Web 服務,以了解幕後發生的情況,從而更好地控制生成。
以上是DTO 序列化期間 Spring Boot 應用程式中出現 StackOverflowError 問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!