@Request dan @ResponseBody anotasi di Spring

140

Adakah yang bisa menjelaskan anotasi @RequestBodydan @ResponseBodydi Spring 3? Untuk apa mereka? Contoh apa pun akan bagus.

Leo
sumber

Jawaban:

222

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.


Memperbarui

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.

Sean Patrick Floyd
sumber
Dalam jawaban tertaut Anda, Anda menggunakan @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 di getDescription(@RequestBody UserStats stats)atas.
Patrick
4
@Patrick no, @RequestBodyada di parameter, @ResponseBodyada di metode. perbedaan penting!
Sean Patrick Floyd
1
@SeanPatrickFloyd Maaf, saya tidak bermaksud menyebutkan @ResponseBodysama sekali. Seperti yang baru saja Anda katakan, @RequestBodylanjutkan dengan parameternya, bukan? Tetapi dalam jawaban di atas, Anda memilikinya pada metode.
Patrick
1
@SeanPatrickFloyd @RequestBodysebenarnya masih diperlukan, @ResponseBodyimplisit saat menggunakan @RestController. Tolong perbaiki jawaban Anda, itu memiliki terlalu banyak suara positif untuk menjadi salah!
Sumit Jain
@SumitJain agar adil: jawaban ini sudah ada sebelumnya @RestControllerdan diubah ketika diperkenalkan
Sean Patrick Floyd
32

@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.

untuk lebih jelasnya

Premraj
sumber
5

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.

AbdusSalam
sumber
1
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 .... .

pengguna5409646
sumber
Harap perbaiki format jawaban dan contoh kode.
Maciej Lach
Jelaskan bagaimana kode ini membantu penanya. Terima kasih.
Leonid Glanz
programming-free.com/2014/03/… .................... melalui tautan ini kamu akan mendapatkan ... terima kasih
pengguna5409646
programming-free.com/2014/03/… ....................................... .................................................. ..... melalui tautan ini Anda akan mendapatkan terima kasih
pengguna5409646