Parameter JSON dengan Spring MVC

1. Ikhtisar

Dalam tutorial singkat ini, kita akan melihat lebih dekat bagaimana bekerja dengan parameter JSON di Spring MVC.

Pertama, kita akan mulai dengan sedikit latar belakang parameter JSON. Kemudian, kita akan pergi ke lubang kelinci untuk melihat bagaimana mengirim parameter JSON dalam permintaan POST dan GET.

2. Parameter JSON di Spring MVC

Menggunakan JSON untuk mengirim atau menerima data adalah praktik umum di kalangan pengembang web. Struktur hierarki dari string JSON menawarkan cara yang lebih ringkas dan dapat dibaca manusia untuk mewakili parameter permintaan HTTP.

Secara default, Spring MVC menyediakan pengikatan data out-of-the-box untuk tipe data sederhana seperti String . Untuk tujuan itu, ini menggunakan daftar editor properti built-in di bawah tenda.

Namun, dalam proyek dunia nyata, kami mungkin ingin mengikat tipe data yang lebih kompleks. Misalnya, mungkin berguna untuk dapat memetakan parameter JSON ke dalam objek model.

3. Kirim Data JSON di POST

Spring menyediakan cara langsung untuk mengirim data JSON melalui permintaan POST. Built-in @RequestBody penjelasan secara otomatis dapat deserialize data JSON dirumuskan dalam tubuh permintaan menjadi objek model khusus.

Secara umum, kami tidak harus mengurai badan permintaan sendiri. Kita bisa menggunakan perpustakaan Jackson untuk melakukan semua pekerjaan 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 diteruskan. Misalnya, pertimbangkan kelas Produk :

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

Kedua, mari kita tentukan metode penanganan Spring yang menerima permintaan POST:

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

Seperti yang bisa kita lihat, memberi anotasi pada argumen produk dengan @RequestBody sudah cukup untuk mengikat data JSON yang dikirim dari klien .

Sekarang, kita dapat menguji permintaan POST kita 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. Kirim Parameter JSON di GET

Spring MVC menawarkan @RequestParam untuk mengekstrak parameter kueri dari permintaan GET. Namun, tidak seperti @RequestBody, yang @RequestParam penjelasan hanya mendukung tipe data sederhana seperti int dan String .

Jadi, untuk mengirim JSON, kita perlu mendefinisikan parameter JSON kita sebagai string sederhana.

Pertanyaan besarnya di sini adalah: Bagaimana kita mengubah parameter JSON kita (yang merupakan String ) menjadi objek kelas Produk ?

Jawabannya cukup sederhana! Kelas ObjectMapper yang disediakan oleh pustaka Jackson menawarkan cara yang fleksibel untuk mengonversi string JSON menjadi objek Java .

Sekarang, mari kita lihat cara mengirim parameter JSON melalui permintaan GET di Spring MVC. Pertama, kita perlu membuat metode penangan lain di pengontrol 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, metode readValue () memungkinkan deserialisasi produk parameter JSON secara langsung ke dalam instance kelas Produk .

Perhatikan bahwa kami mendefinisikan parameter kueri JSON kami sebagai objek String . Sekarang, bagaimana jika kita ingin meneruskan objek Product seperti yang kita lakukan saat menggunakan @RequestBody ?

Untuk menjawab pertanyaan ini, Spring memberikan solusi yang ringkas dan fleksibel melalui editor properti khusus.

Pertama, kita perlu membuat editor properti khusus untuk merangkum logika mengonversi 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); } } }

Selanjutnya, mari ikat parameter JSON ke objek kelas Produk :

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

Terakhir, kita perlu menambahkan potongan puzzle terakhir yang hilang. Mari daftarkan ProductEditor di pengontrol Spring kami :

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

Ingatlah bahwa kita perlu mengenkode URL parameter JSON untuk memastikan pengangkutan yang aman .

Jadi, alih-alih:

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

Kami perlu mengirim:

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

Singkatnya, kami melihat bagaimana bekerja dengan JSON di Spring MVC. Sepanjang jalan, kami memamerkan cara mengirim parameter JSON dalam permintaan POST dan GET.

Seperti biasa, kode sumber lengkap dari contoh tersedia di GitHub.