Respostas:
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: @RequestBody
javadocs, @ResponseBody
javadocs
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 @RequestBody
anotação) e serializará o objeto retornado em JSON (porque você adicionou o @ResponseBody
anotaçã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.
Desde o Spring 4.x, você normalmente não usa @ResponseBody
no nível do método, mas @RestController
no 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@Controller
e@ResponseBody
para indicar um controlador cujo método herda a@ResponseBody
anotaçã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.
@RequestBody
está no parâmetro, @ResponseBody
está no método diferença importante!
@ResponseBody
nada. Como você acabou de dizer, @RequestBody
vai no parâmetro, certo? Mas na resposta acima, você tem o método.
@RequestBody
ainda é necessário, @ResponseBody
está implícito ao usar @RestController
. Pls corrija sua resposta, tem muitos votos para ser falso!
@RestController
e foi mudado quando foi introduzido
@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 @Controller
anotação. Isso removerá a necessidade de usar @ResponseBody
.
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.
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 .... .
@ResponseBody
anotaçã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 tergetDescription(@RequestBody UserStats stats)
acima.