Rumah > Java > Isu StackOverflowError dalam aplikasi Spring Boot semasa siri DTO

Isu StackOverflowError dalam aplikasi Spring Boot semasa siri DTO

王林
Lepaskan: 2024-02-05 23:06:04
ke hadapan
658 orang telah melayarinya
Kandungan soalan

Saya mendapat stackoverflowerror dalam aplikasi but spring apabila saya cuba mensiri kelas dto (nodeattributesdto) dengan hubungan rujukan kendiri. Ralat berlaku semasa pelaksanaan kaedah tostring dalam kelas 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.
Salin selepas log masuk

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() +
        "}";
}
Salin selepas log masuk

teks permintaan pemetaan pos:

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

Ralat:

{
    "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"
}
Salin selepas log masuk

Soalan:

  1. Bagaimana untuk mengubah suai kaedah tostring dalam nodeattributesto class untuk mengelakkan stackoverflowerror semasa bersiri?
  2. Adakah terdapat sebarang anotasi atau konfigurasi jackson khusus yang perlu saya pertimbangkan semasa berurusan dengan perhubungan rujukan kendiri dalam dtos?

Persekitaran: Versi but musim bunga: 2.7.2 versi java: 17 Pangkalan data: postgresql

Saya dah cuba:

  • Anotasi jackson yang berbeza (@jsonmanagedreference, @jsonbackreference)

Jawapan betul


Saya percaya kekeliruan anda ialah toString tidak mengawal marshalling dalam Spring Boot.

Jika anda ingin log objek ini ke ralat standard melalui System.err.println(), ia akan menggunakan toString.

Nampaknya toString anda pada asasnya cuba menjadi longgokan data secara rekursif, tetapi itu tidak betul. Saya fikir ia hanya Java/CS asas.

Dalam toString, anda hanya boleh mencetak data nod semasa dan kemudian memanggil toString(delegate) pada semua nod anak. Ia sepatutnya boleh melakukan ini. Saya fikir secara umum anda tidak memerlukan rujukan belakang (untuk toString) kerana anda akan bermula dari bahagian atas "pokok".

Marshaller memeriksa objek dan menggunakan pantulan untuk menyusun perwakilan bersiri. Seperti yang anda perhatikan, ia akan menghormati anotasi tertentu. Contohnya @JsonIgnore.

Lihat: Bagaimana untuk mengabaikan respons medan dalam json?

Terdapat banyak maklumat bagus di sini: https://www.php.cn/link/ffe4a40fecc90fa1120088e704712fb2

Ia juga mungkin membantu untuk membuat perkhidmatan web ringkas di luar alat penjanaan kod (seperti jhipster) untuk memahami perkara yang berlaku di sebalik tabir dan dengan itu mempunyai kawalan yang lebih baik ke atas penjanaan.

Atas ialah kandungan terperinci Isu StackOverflowError dalam aplikasi Spring Boot semasa siri DTO. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan