Parameter JSON dengan Spring MVC

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melihat bagaimana cara bekerja dengan parameter JSON di Spring MVC.

Pertama, kita akan mulakan dengan sedikit latar belakang parameter JSON. Kemudian, kita akan pergi ke lubang arnab untuk melihat cara menghantar parameter JSON dalam permintaan POST dan GET.

2. Parameter JSON di Spring MVC

Menggunakan JSON untuk menghantar atau menerima data adalah amalan biasa di kalangan pembangun web. Struktur hierarki rentetan JSON menawarkan cara yang lebih padat dan mudah dibaca manusia untuk mewakili parameter permintaan HTTP.

Secara lalai, Spring MVC menyediakan pengikatan data di luar kotak untuk jenis data mudah seperti String . Untuk tujuan itu, ia menggunakan senarai editor harta tanah terbina dalam.

Walau bagaimanapun, dalam projek dunia nyata, kita mungkin ingin mengikat jenis data yang lebih kompleks. Sebagai contoh, mungkin berguna untuk memetakan parameter JSON ke objek model.

3. Hantar Data JSON dalam POST

Spring menyediakan cara mudah untuk menghantar data JSON melalui permintaan POST. Anotasi @RequestBody yang terbina dalam secara automatik dapat membuat deserialisasi data JSON yang dikemas dalam badan permintaan menjadi objek model tertentu.

Secara umum, kita tidak perlu menguraikan badan permintaan sendiri. Kita boleh menggunakan perpustakaan Jackson untuk melakukan semua tugas berat untuk kita .

Sekarang, mari kita lihat cara mengirim data JSON melalui permintaan POST di Spring MVC.

Pertama, kita perlu membuat objek model untuk mewakili data JSON yang dilalui. Contohnya, pertimbangkan kelas Produk :

public class Product { private int id; private String name; private double price; // default constructor + getters + setters }

Kedua, mari kita tentukan kaedah pengendali Spring yang menerima permintaan POST:

@PostMapping("/create") @ResponseBody public Product createProduct(@RequestBody Product product) { // custom logic return product; }

Seperti yang kita lihat, memberi penjelasan mengenai argumen produk dengan @RequestBody sudah cukup untuk mengikat data JSON yang dihantar dari pelanggan .

Sekarang, kami dapat menguji permintaan POST kami menggunakan cURL:

curl -i \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -X POST --data \ '{"id": 1,"name": "Asus Zenbook","price": 800}' "//localhost:8080/spring-mvc-basics-4/products/create"

4. Hantar Parameter JSON di GET

Spring MVC menawarkan @RequestParam untuk mengekstrak parameter pertanyaan dari permintaan GET. Walau bagaimanapun, tidak seperti @RequestBody, yang @RequestParam anotasi sokongan hanya jenis data yang mudah seperti int dan tali .

Jadi, untuk menghantar JSON, kita perlu menentukan parameter JSON sebagai rentetan mudah.

Persoalan besar di sini ialah: Bagaimana kita mengubah parameter JSON (yang merupakan String ) menjadi objek kelas Produk ?

Jawapannya cukup mudah! The ObjectMapper kelas yang disediakan oleh Jackson perpustakaan tawaran cara yang fleksibel untuk menukar rentetan JSON ke Jawa objek .

Sekarang, mari kita lihat cara mengirim parameter JSON melalui permintaan GET di Spring MVC. Pertama, kita perlu membuat kaedah pengendali lain di pengawal kita untuk menangani permintaan GET:

@GetMapping("/get") @ResponseBody public Product getProduct(@RequestParam String product) throws JsonMappingException, JsonProcessingException { Product prod = objectMapper.readValue(product, Product.class); return prod; }

Seperti yang ditunjukkan di atas, kaedah readValue () membolehkan deserialisasi produk parameter JSON secara langsung menjadi contoh kelas Produk .

Perhatikan bahawa kami menentukan parameter pertanyaan JSON kami sebagai objek String . Sekarang, bagaimana jika kita ingin melepasi objek Produk seperti yang kita lakukan ketika menggunakan @RequestBody ?

Untuk menjawab soalan ini, Spring memberikan penyelesaian yang ringkas dan fleksibel melalui penyunting harta tanah khusus.

Pertama, kita perlu membuat penyunting harta tanah khusus untuk merangkumi logik menukar parameter JSON yang diberikan sebagai String ke objek Produk :

public class ProductEditor extends PropertyEditorSupport { private ObjectMapper objectMapper; public ProductEditor(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { setValue(null); } else { Product prod = new Product(); try { prod = objectMapper.readValue(text, Product.class); } catch (JsonProcessingException e) { throw new IllegalArgumentException(e); } setValue(prod); } } }

Seterusnya, mari kita mengikat parameter JSON ke objek kelas Produk :

@GetMapping("/get2") @ResponseBody public Product get2Product(@RequestParam Product product) { // custom logic return product; }

Terakhir, kita perlu menambahkan potongan teka-teki yang terakhir. Mari daftarkan ProductEditor di pengawal Spring kami :

@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Product.class, new ProductEditor(objectMapper)); }

Perlu diingat bahawa kita perlu menyandikan URL parameter JSON untuk memastikan pengangkutan yang selamat .

Jadi, bukannya:

GET /spring-mvc-basics-4/products/get2?product={"id": 1,"name": "Asus Zenbook","price": 800}

Kami perlu menghantar:

GET /spring-mvc-basics-4/products/get2?product=%7B%22id%22%3A%201%2C%22name%22%3A%20%22Asus%20Zenbook%22%2C%22price%22%3A%20800%7D

5. Kesimpulan

Ringkasnya, kami melihat bagaimana bekerjasama dengan JSON di Spring MVC. Sepanjang perjalanan, kami memaparkan cara mengirim parameter JSON dalam permintaan POST dan GET.

Seperti biasa, kod sumber penuh contoh terdapat di GitHub.