İlkbaharda @RequestBody ve @ResponseBody ek açıklamaları


139

Birisi Bahar 3'teki açıklamaları @RequestBodyve @ResponseBodyaçıklamaları açıklayabilir mi? Ne için bunlar? Herhangi bir örnek harika olurdu.

Yanıtlar:


219

Dokümanlarda 16.3.3.4 İstek gövdesini @RequestBody ek açıklamasıyla eşleme adlı bir bölüm var . Ve biri 16.3.3.5 Yanıt gövdesini @ResponseBody ek açıklamasıyla eşleme olarak adlandırdı . Bu bölümlere bakmanızı öneririm. Ayrıca ilgili: @RequestBodyjavadoklar, @ResponseBodyjavadoklar

Kullanım örnekleri şöyle olacaktır:

JQuery gibi bir JavaScript kitaplığı kullanarak, aşağıdaki gibi bir JSON Nesnesi gönderirsiniz:

{ "firstName" : "Elmer", "lastName" : "Fudd" }

Denetleyici yönteminiz şöyle görünür:

// 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
}

Şimdi sınıf yolunuzda Jackson varsa (ve bir <mvc:annotation-driven>kurulumunuz varsa), Spring gelen JSON'u yazı gövdesinden bir UserStats nesnesine dönüştürür ( @RequestBodyek açıklamayı eklediğiniz için ) ve döndürülen nesneyi JSON'a serileştirir ( @ResponseBodyaçıklama). Tarayıcı / İstemci bu JSON sonucunu görür:

{ "description" : "Elmer Fudd hates wacky wabbits" }

Tam bir çalışma örneğin benim bu cevaba bakınız: https://stackoverflow.com/a/5908632/342852

Not: RequestBody / ResponseBody elbette JSON ile sınırlı değildir, her ikisi de düz metin ve XML de dahil olmak üzere birden çok biçimi işleyebilir, ancak JSON muhtemelen en çok kullanılan biçimdir.


Güncelleme

İlkbahar 4.x'ten bu yana, genellikle @ResponseBodyyöntem düzeyinde değil @RestController, aynı etkiyle sınıf düzeyinde kullanacaksınız .

Resmi Spring MVC belgelerinden bir alıntı :

@RestControllera, oluşan açıklama kendisi açıklamalı Meta ile @Controllerve @ResponseBodyolan her metot, tip seviye devralan bir kontrolör belirtmek için @ResponseBodyek açıklama ve bu nedenle, görüş çözünürlüğe karşı yanıt gövdesi doğrudan yazar ve bir HTML şablonu ile işleme.


Bağlantılı yanıtınızda, @ResponseBodyyöntemi değil parametreyi ek açıklama kullandınız . Yönteme koymaya çalışırken hata alıyorum, bu yüzden diğer cevabınızın doğru olduğunu varsayıyorum. Bence getDescription(@RequestBody UserStats stats)yukarıda olmalı .
Patrick

3
@Patrick no, @RequestBodyparametre @ResponseBodyüzerinde, yöntem üzerinde. önemli fark!
Sean Patrick Floyd

1
@SeanPatrickFloyd Üzgünüm, hiç bahsetmek istemedim @ResponseBody. Az önce söylediğin gibi, @RequestBodyparametreye devam ediyor değil mi? Ancak yukarıdaki cevapta, yöntem üzerinde var.
Patrick

1
@SeanPatrickFloyd @RequestBodyaslında hala gerekli, @ResponseBodykullanırken örtük @RestController. Pls cevabınızı düzeltin, yanlış olmak için çok fazla upvotes var!
Sumit Jain

Adil olmak için: Bu cevap daha önce vardı @RestControllerve tanıtıldığında değiştirildi
Sean Patrick Floyd

32

@RequestBody : Bir yöntem parametresini gösteren ek açıklama HTTP isteğinin gövdesine bağlanmalıdır.

Örneğin:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

@ResponseBody ek açıklaması bir yönteme konabilir ve dönüş türünün doğrudan HTTP yanıt gövdesine yazılması gerektiğini (ve bir Model içine yerleştirilmemesi veya görünüm adı olarak yorumlanması gerektiğini) belirtir.

Örneğin:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() {
    return "Hello World";
}  

Alternatif olarak, ek açıklama yerine @RestController ek açıklamasını kullanabiliriz @Controller. Bu, kullanma ihtiyacını ortadan kaldıracaktır @ResponseBody.

daha fazla ayrıntı için


5

Aşağıda, Java denetleyicisinde bir yönteme örnek verilmiştir.

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}

@RequestBody ek açıklamasını kullanarak, belirli bir çağrıyı yönetmek için değerlerinizi sisteminizde oluşturduğunuz modelle eşleştireceksiniz. @ResponseBody öğesini kullanarak, isteğin oluşturulduğu yere herhangi bir şey gönderebilirsiniz. Her iki şey de özel ayrıştırıcı yazmadan kolayca eşleştirilecektir.


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;
 }


}

Yukarıdaki örnekte tüm kullanıcı ve belirli kimlik ayrıntılarını görüntüleyecekler, şimdi hem id hem de ad kullanmak istiyorum,

1) localhost: 8093 / plejson / mağaza / kullanıcı <--- bu bağlantı tüm kullanıcı ayrıntılarını gösterecektir
2) localhost: 8093 / plejson / mağaza / kullanıcı / 11 <---- 11 bağlantı anlamına gelirse, belirli kullanıcı 11 ayrıntılarını göster

şimdi hem kimliği hem de adı kullanmak istiyorum

localhost: 8093 / plejson / mağaza / kullanıcı / 11 / raju <----------------- bunun gibi herhangi birini kullanabilirsiniz anlamına gelir lütfen bana yardım .... .


Lütfen cevap ve kod örneğinin biçimlendirmesini düzeltin.
Maciej Lach

Lütfen bu kodun sorgulayıcıya nasıl yardımcı olduğunu açıklayın. Teşekkür ederim.
Leonid Glanz

programming-free.com/2014/03/… .................... bu bağlantı üzerinden gitmek u alacak ... teşekkür ederim
user5409646

programming-free.com/2014/03/… ....................................... .................................................. ..... u teşekkür alacak bu bağlantı üzerinden gitmek
user5409646
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.