Misalkan saya memiliki halaman yang mencantumkan objek pada tabel dan saya perlu meletakkan formulir untuk memfilter tabel. Filter dikirim sebagai Ajax GET ke URL seperti itu: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
Dan bukannya memiliki banyak parameter pada Kontroler saya seperti:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
Dan seandainya saya memiliki MyObject sebagai:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Saya ingin melakukan sesuatu seperti:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
Apa itu mungkin? Bagaimana saya bisa melakukan itu?
java
spring-mvc
renanleandrof
sumber
sumber
@ModelAttribute
, Contoh Penanganan Formulir Spring MVC . Hanya google " Spring MVC form handling " dan Anda akan mendapatkan banyak tutorial / contoh. Tetapi pastikan untuk menggunakan cara modern penanganan formulir, yaitu Spring v2.5 +@ModelAttribute
di Spring MVCJawaban:
Anda benar-benar dapat melakukan itu, cukup hapus
@RequestParam
anotasi, Spring akan dengan rapi mengikat parameter permintaan Anda ke instance kelas Anda:sumber
MyObject
saat itu, dengan cara serupa yang bisa kita lakukan dengan @RequestParam?MyObject
untuk menerima parameter kueri dalam case Snake dan memetakannya ke anggota case untaMyObject
. Misalnya,?book_id=4
harus dipetakan denganbookId
anggotaMyObject
?Saya akan menambahkan beberapa contoh singkat dari saya.
Kelas DTO:
Meminta pemetaan di dalam kelas pengontrol:
Pertanyaan:
Hasil:
Saya harap ini membantu :)
PEMBARUAN / KOTLIN
Karena saat ini saya banyak bekerja dengan Kotlin jika seseorang ingin mendefinisikan DTO serupa, kelas di Kotlin harus memiliki bentuk berikut:
Dengan
data
kelas seperti ini:Spring (diuji dalam Booting) mengembalikan kesalahan berikut untuk permintaan yang disebutkan dalam jawaban:
Kelas data hanya akan berfungsi untuk formulir params permintaan berikut:
Sadarilah ini!
sumber
Saya memiliki masalah yang sangat mirip. Sebenarnya masalahnya lebih dalam seperti yang saya kira. Saya menggunakan jquery
$.post
yang menggunakanContent-Type:application/x-www-form-urlencoded; charset=UTF-8
sebagai default. Sayangnya saya mendasarkan sistem saya pada itu dan ketika saya membutuhkan objek yang kompleks sebagai@RequestParam
saya tidak bisa mewujudkannya.Dalam kasus saya, saya mencoba mengirim preferensi pengguna dengan sesuatu seperti;
Di sisi klien, data mentah aktual yang dikirim ke server adalah;
diuraikan sebagai;
dan sisi server adalah;
Saya mencoba
@ModelAttribute
, menambahkan setter / getter, konstruktor dengan semua kemungkinanUserPreferences
tetapi tidak ada kesempatan karena mengenali data yang dikirim sebagai 5 parameter tetapi pada kenyataannya metode yang dipetakan hanya memiliki 2 parameter. Saya juga mencoba solusi Biju namun yang terjadi adalah, spring membuat objek UserPreferences dengan konstruktor default dan tidak mengisi data.Saya memecahkan masalah dengan mengirim string JSon preferensi dari sisi klien dan menanganinya seolah-olah itu adalah String di sisi server;
klien:
server:
Singkatnya, saya melakukan konversi secara manual di dalam metode REST. Menurut pendapat saya alasan mengapa pegas tidak mengenali data yang dikirim adalah tipe konten.
sumber
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Karena pertanyaan tentang cara mengatur bidang wajib muncul di bawah setiap posting, saya menulis contoh kecil tentang cara mengatur bidang yang diperlukan:
sumber
Sementara jawaban yang merujuk kepada
@ModelAttribute
,@RequestParam
,@PathParam
dan sejenisnya adalah valid, ada gotcha kecil aku berlari ke dalam. Parameter metode yang dihasilkan adalah proxy yang Spring membungkus DTO Anda. Jadi, jika Anda mencoba menggunakannya dalam konteks yang memerlukan jenis kustom Anda sendiri, Anda mungkin mendapatkan beberapa hasil yang tidak terduga.Berikut ini tidak akan berfungsi:
Dalam kasus saya, mencoba menggunakannya dalam pengikatan Jackson menghasilkan a
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Anda harus membuat objek baru dari dto.
sumber
Ya, Anda bisa melakukannya dengan cara yang sederhana. Lihat kode baris di bawah ini.
URL - http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
sumber
Jawaban yang diterima berfungsi seperti mantra tetapi jika objek memiliki daftar objek, itu tidak akan berfungsi seperti yang diharapkan jadi di sini adalah solusi saya setelah beberapa penggalian.
Mengikuti saran utas ini , berikut adalah cara saya melakukannya.
Ini bukan yang terbaik untuk men-debug API Anda dengan tukang pos tetapi berfungsi seperti yang diharapkan untuk saya.
Dan di sini SearchFilterDTO dan FilterDTO
sumber