Adakah yang bisa menjelaskan anotasi @RequestBody
dan @ResponseBody
di 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: @RequestBody
javadocs, @ResponseBody
javadocs
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 @RequestBody
anotasi) dan itu akan membuat serial objek yang dikembalikan ke JSON (karena Anda menambahkan @ResponseBody
anotasi). 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 @ResponseBody
pada level metode, melainkan @RestController
pada level kelas, dengan efek yang sama.
Berikut kutipan dari dokumentasi resmi Spring MVC :
@RestController
adalah penjelasan terdiri yang itu sendiri meta-dijelaskan dengan@Controller
dan@ResponseBody
untuk menunjukkan controller yang setiap metode mewarisi jenis-tingkat@ResponseBody
penjelasan dan, karena itu, menulis langsung ke respon tubuh terhadap pandangan resolusi dan render dengan template HTML.
@RequestBody
ada di parameter, @ResponseBody
ada di metode. perbedaan penting!
@ResponseBody
sama sekali. Seperti yang baru saja Anda katakan, @RequestBody
lanjutkan dengan parameternya, bukan? Tetapi dalam jawaban di atas, Anda memilikinya pada metode.
@RequestBody
sebenarnya masih diperlukan, @ResponseBody
implisit saat menggunakan @RestController
. Tolong perbaiki jawaban Anda, itu memiliki terlalu banyak suara positif untuk menjadi salah!
@RestController
dan 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 @Controller
anotasi. 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 .... .
@ResponseBody
anotasi 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.