Adakah yang bisa menjelaskan anotasi @RequestBodydan @ResponseBodydi Spring 3? Untuk apa mereka? Contoh apa pun akan bagus.
Jawaban:
Ada seluruh Bagian dalam dokumen yang disebut 16.3.3.4 Memetakan isi permintaan dengan anotasi @RequestBody . Dan yang disebut 16.3.3.5 Memetakan isi respons dengan anotasi @ResponseBody . Saya sarankan Anda berkonsultasi dengan bagian tersebut. Juga relevan: @RequestBodyjavadocs, @ResponseBodyjavadocs
Contoh penggunaan akan menjadi seperti ini:
Menggunakan pustaka-JavaScript seperti JQuery, Anda akan memposting Objek-JSON seperti ini:
{ "firstName" : "Elmer", "lastName" : "Fudd" }
Metode pengontrol Anda akan terlihat seperti ini:
// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}
// domain / value objects
public class UserStats{
private String firstName;
private String lastName;
// + getters, setters
}
public class Description{
private String description;
// + getters, setters, constructor
}
Sekarang jika Anda memiliki Jackson di jalur kelas Anda (dan memiliki <mvc:annotation-driven>penyiapan), Spring akan mengonversi JSON yang masuk ke objek UserStats dari badan posting (karena Anda menambahkan @RequestBodyanotasi) dan itu akan membuat serial objek yang dikembalikan ke JSON (karena Anda menambahkan @ResponseBodyanotasi). Jadi Browser / Klien akan melihat hasil JSON ini:
{ "description" : "Elmer Fudd hates wacky wabbits" }
Lihat jawaban saya sebelumnya ini untuk contoh kerja lengkap: https://stackoverflow.com/a/5908632/342852
Catatan: RequestBody / ResponseBody tentu saja tidak terbatas pada JSON, keduanya dapat menangani berbagai format, termasuk teks biasa dan XML, tetapi JSON mungkin adalah format yang paling sering digunakan.
Sejak Spring 4.x, Anda biasanya tidak akan menggunakan @ResponseBodypada level metode, melainkan @RestControllerpada level kelas, dengan efek yang sama.
Berikut kutipan dari dokumentasi resmi Spring MVC :
@RestControlleradalah penjelasan terdiri yang itu sendiri meta-dijelaskan dengan@Controllerdan@ResponseBodyuntuk menunjukkan controller yang setiap metode mewarisi jenis-tingkat@ResponseBodypenjelasan dan, karena itu, menulis langsung ke respon tubuh terhadap pandangan resolusi dan render dengan template HTML.
@RequestBodyada di parameter, @ResponseBodyada di metode. perbedaan penting!
@ResponseBodysama sekali. Seperti yang baru saja Anda katakan, @RequestBodylanjutkan dengan parameternya, bukan? Tetapi dalam jawaban di atas, Anda memilikinya pada metode.
@RequestBodysebenarnya masih diperlukan, @ResponseBodyimplisit saat menggunakan @RestController. Tolong perbaiki jawaban Anda, itu memiliki terlalu banyak suara positif untuk menjadi salah!
@RestControllerdan diubah ketika diperkenalkan
@RequestBody : Anotasi yang menunjukkan parameter metode harus diikat ke badan permintaan HTTP.
Sebagai contoh:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
Anotasi @ResponseBody dapat diletakkan pada metode dan menunjukkan bahwa jenis yang dikembalikan harus ditulis langsung ke isi respons HTTP (dan tidak ditempatkan dalam Model, atau diartikan sebagai nama tampilan).
Sebagai contoh:
@RequestMapping(path = "/something", method = RequestMethod.PUT)
public @ResponseBody String helloWorld() {
return "Hello World";
}
Atau, kita bisa menggunakan anotasi @RestController sebagai pengganti @Controlleranotasi. Ini akan menghilangkan kebutuhan untuk menggunakan @ResponseBody.
Di bawah ini adalah contoh metode dalam pengontrol Java.
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
Dengan menggunakan anotasi @RequestBody, Anda akan mendapatkan nilai yang dipetakan dengan model yang Anda buat di sistem untuk menangani panggilan tertentu. Sedangkan dengan menggunakan @ResponseBody, Anda dapat mengirim kembali apa pun ke tempat permintaan dibuat. Kedua hal tersebut akan dipetakan dengan mudah tanpa menulis parser khusus, dll.
package com.programmingfree.springshop.controller;
import java.util.List;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;
@RestController
@RequestMapping("/shop/user")
public class SpringShopController {
UserShop userShop=new UserShop();
@RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
public User getUser(@PathVariable int id) {
User user=userShop.getUserById(id);
return user;
}
@RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
public List<User> getAllUsers() {
List<User> users=userShop.getAllUsers();
return users;
}
}
Dalam contoh di atas mereka akan menampilkan semua pengguna dan detail id tertentu sekarang saya ingin menggunakan id dan nama,
1) localhost: 8093 / plejson / shop / user <--- tautan ini akan menampilkan semua detail pengguna
2) localhost: 8093 / plejson / shop / user / 11 <---- jika saya menggunakan 11 dalam arti tautan, itu akan menampilkan detail pengguna tertentu 11
sekarang saya ingin menggunakan id dan name
localhost: 8093 / plejson / shop / user / 11 / raju <----------------- seperti ini berarti kita dapat menggunakan salah satu dalam hal ini, tolong bantu saya .... .
@ResponseBodyanotasi pada parameter, bukan metodenya. Saya mendapatkan kesalahan saat mencoba memasukkannya ke dalam metode, jadi saya berasumsi jawaban Anda yang lain benar. Saya pikir Anda harus memiliki digetDescription(@RequestBody UserStats stats)atas.