Objek Domain Dikembalikan dari RestController menyebabkan kesalahan AJAX; Objek Model Kustom berfungsi

Saya memiliki masalah di SpringMVC RestController saya yang menulis hasil JSON:

1) Saat saya mengembalikan objek domain seperti di bawah ini, AktivitasT, saya mendapatkan Kesalahan Server Internal AJAX 500 di sisi klien.

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    return activitiesT;
}

Objek Domain ActivityT, yang dihasilkan oleh Hiberate:

@Entity
@Table(name = "activities_t", schema = "public")
public class ActivitiesT implements java.io.Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private int id;
    //... etc...
}

2) Namun ketika saya mengembalikan POJO khusus, metode AJAX berfungsi. Hampir sama.

@RequestMapping("/participant/activityForEvent") 
public ActivitiesT getActivityForGuiEventId() throws Exception {
    ActivitiesT activitiesT = participantService.getActivity();
    // Create a custom Activity POJO and return it
    return new Activity(activitiesT.id, activitiesT.title);
}

POJO kustom aktivitas:

public class Activity implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public int id;
    public String title;
     //etc.

PESAN KESALAHAN

HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - 

tidak ada Sesi (melalui rantai referensi: com.myapp")

Beberapa hal yang perlu diperhatikan:

  • Kedua objek mengimplementasikan Serializable, tidak apa-apa
  • Masalahnya bukan pada DAO, saya dapat melihat DAO selalu mengembalikan data yang benar untuk keduanya, kita dapat mengabaikan bagian DAO
  • Pengontrol dianotasi dengan @RestController, sehingga selalu mengeluarkan JSON; Saya tidak memerlukan ResponseBody atau tag lama

Adakah pemikiran tentang di mana letak masalahnya? Masalahnya bermuara pada ini:

  • Saya tidak dapat mengembalikan JSON dari metode RestController pada @Entity POJO yang dihasilkan Hibernate,
  • Tapi saya bisa mengembalikan JSON dari metode RestController di POJO khusus saya sendiri

person gene b.    schedule 18.12.2017    source sumber
comment
Bisakah Anda memberikan pengecualian yang diberikan (500 Internal Server Error)?   -  person lzagkaretos    schedule 18.12.2017
comment
Tidak ada pengecualian yang diberikan di sisi server, Pengontrol selesai dengan OK. Saya hanya melihat 500 Internal Server Error di Firebug ketika saya membuka AJAX JS di sisi klien.   -  person gene b.    schedule 18.12.2017
comment
500 Internal Server Error menunjukkan sesuatu sedang terjadi di sisi server. Saya telah melihat masalah seperti ini, dalam serialisasi objek besar, ActivitiesT adalah objek sederhana atau kompleks (hanya menebak) di mana semacam Pengecualian dilemparkan setelah Pengontrol mengembalikan nilainya.   -  person lzagkaretos    schedule 18.12.2017
comment
Saya mendapat pesan kesalahan sekarang, ini dia: HTTP Status 500 - Could not write JSON: could not initialize proxy - no Session; nested exception is com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy - no Session (through reference chain: com.myapp")   -  person gene b.    schedule 18.12.2017
comment
Mungkin di Entitas terdapat semacam inisialisasi Malas, dan ketika Jackson mencoba mengakses properti ini, daftar, tidak ada transaksi yang tersedia. Bisakah Anda memeriksanya?   -  person lzagkaretos    schedule 18.12.2017
comment
Ya sepertinya ada utas di sini: stackoverflow.com/questions/26957554/ Penjelasannya adalah, Ini terjadi ketika Anda mengembalikan objek melalui @Responsebody (atau dalam kasus Anda badan respons melalui @RestController) dan objek sedang diserialisasi tetapi memiliki anak dalam koleksi MALAS yang belum direferensikan. Pada saat Anda berada di pengontrol, tidak ada lagi transaksi aktif yang akan memfasilitasi pengambilannya   -  person gene b.    schedule 18.12.2017
comment
Ya, saya yakin inilah masalahnya. :) Semoga beruntung   -  person lzagkaretos    schedule 18.12.2017


Jawaban (1)


Saat Jackson menyiapkan respons, ia secara rekursif mencoba mengonversi kelas model ke JSON. Misalnya jika Anda memiliki hubungan Departemen dan Karyawan dengan hubungan satu ke banyak, maka Jackson mengeksekusi metode getEmployees() di Department.java untuk menyiapkan respons. Tapi getEmployees() Metode memerlukan hibernasi untuk menjalankan kueri lain untuk mengambil catatan karyawan dari DB karena pemuatan lambat. Tapi sesinya sudah ditutup. Karenanya Anda mendapatkan kesalahan ini. Untuk menghindari hal ini, selalu gunakan DTO daripada kelas model sebenarnya. Dan hal yang sama yang telah Anda sebutkan - Objek Domain yang Dikembalikan dari RestController menyebabkan kesalahan AJAX; Objek Model Kustom berfungsi.

person Dhiraj Ray    schedule 19.12.2017
comment
Ya, kami sekarang menggunakan POJO biasa untuk semua metode pengembalian JSON. terima kasih - person gene b.; 19.12.2017