Anotações @RequestBody e @ResponseBody no Spring


138

Alguém pode explicar as anotações @RequestBodye @ResponseBodyna primavera 3? Para que servem? Qualquer exemplo seria ótimo.

Respostas:


218

Existe uma seção inteira nos documentos chamada 16.3.3.4 Mapeando o corpo da solicitação com a anotação @RequestBody . E um chamado 16.3.3.5 Mapeando o corpo da resposta com a anotação @ResponseBody . Eu sugiro que você consulte essas seções. Também relevante: @RequestBodyjavadocs, @ResponseBodyjavadocs

Exemplos de uso seriam algo assim:

Usando uma biblioteca JavaScript como o JQuery, você publicaria um objeto JSON como este:

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

O método do seu controlador ficaria assim:

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

Agora, se você tiver Jackson em seu caminho de classe (e tiver uma <mvc:annotation-driven>configuração), o Spring converterá o JSON recebido em um objeto UserStats do corpo da postagem (porque você adicionou a @RequestBodyanotação) e serializará o objeto retornado em JSON (porque você adicionou o @ResponseBodyanotação). Portanto, o Navegador / Cliente veria este resultado JSON:

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

Consulte esta resposta anterior minha para obter um exemplo de trabalho completo: https://stackoverflow.com/a/5908632/342852

Nota: RequestBody / ResponseBody obviamente não se limita ao JSON, ambos podem manipular vários formatos, incluindo texto sem formatação e XML, mas JSON é provavelmente o formato mais usado.


Atualizar

Desde o Spring 4.x, você normalmente não usa @ResponseBodyno nível do método, mas @RestControllerno nível da classe, com o mesmo efeito.

Aqui está uma citação da documentação oficial do Spring MVC :

@RestControlleré uma anotação composta que é meta-anotada com @Controllere @ResponseBodypara indicar um controlador cujo método herda a @ResponseBodyanotação em nível de tipo e, portanto, grava diretamente no corpo da resposta versus a resolução da visualização e a renderização com um modelo HTML.


Na sua resposta vinculada, você usou a @ResponseBodyanotação no parâmetro, não no método. Recebo erros ao tentar aplicá-lo no método, portanto, suponho que sua outra resposta esteja correta. Eu acho que você deveria ter getDescription(@RequestBody UserStats stats)acima.
Patrick

3
@ Patrick não, @RequestBodyestá no parâmetro, @ResponseBodyestá no método diferença importante!
Sean Patrick Floyd

1
@SeanPatrickFloyd Desculpe, eu não quis mencionar @ResponseBodynada. Como você acabou de dizer, @RequestBodyvai no parâmetro, certo? Mas na resposta acima, você tem o método.
23413 Patrick

1
O @SeanPatrickFloyd @RequestBodyainda é necessário, @ResponseBodyestá implícito ao usar @RestController. Pls corrija sua resposta, tem muitos votos para ser falso!
precisa saber é o seguinte

@SumitJain para ser justo: esta resposta foi de cerca de antes @RestControllere foi mudado quando foi introduzido
Sean Patrick Floyd

32

@RequestBody : uma anotação indicando que um parâmetro de método deve ser associado ao corpo da solicitação HTTP.

Por exemplo:

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

A anotação @ResponseBody pode ser colocada em um método e indica que o tipo de retorno deve ser gravado diretamente no corpo da resposta HTTP (e não colocado em um Model ou interpretado como um nome de exibição).

Por exemplo:

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

Como alternativa, podemos usar a anotação @RestController no lugar da @Controlleranotação. Isso removerá a necessidade de usar @ResponseBody.

para mais detalhes


5

Abaixo está um exemplo de um método em um controlador Java.

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

Usando a anotação @RequestBody, seus valores serão mapeados com o modelo que você criou em seu sistema para lidar com qualquer chamada específica. Ao usar @ResponseBody, você pode enviar qualquer coisa de volta ao local de onde a solicitação foi gerada. Ambas as coisas serão mapeadas facilmente sem escrever nenhum analisador personalizado, etc.


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


}

No exemplo acima, eles exibirão todos os detalhes do usuário e do ID específico agora. Quero usar o ID e o nome,

1) localhost: 8093 / plejson / shop / user <--- este link exibirá todos os detalhes do usuário
2) localhost: 8093 / plejson / shop / user / 11 <---- se eu usar 11 no link significa exibir detalhes específicos do usuário 11

agora eu quero usar id e nome

localhost: 8093 / plejson / shop / user / 11 / raju <----------------- assim significa que podemos usar qualquer um neste, por favor me ajude .... .


Corrija a formatação da amostra de resposta e código.
Maciej Lach

Por favor, descreva como esse código ajuda o questionador. Obrigado.
Leonid Glanz

programming-free.com/2014/03/… .................... passar por este link você receberá ... obrigado
user5409646

programming-free.com/2014/03/… ....................................... .................................................. ..... ir através deste link u ficará obrigado
user5409646
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.