Alguém pode explicar as anotações @RequestBody
e @ResponseBody
na primavera 3? Para que servem? Qualquer exemplo seria ótimo.
Alguém pode explicar as anotações @RequestBody
e @ResponseBody
na primavera 3? Para que servem? Qualquer exemplo seria ótimo.
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.
@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.@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:
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:
Como alternativa, podemos usar a anotação @RestController no lugar da
@Controller
anotação. Isso removerá a necessidade de usar@ResponseBody
.para mais detalhes
fonte
Abaixo está um exemplo de um método em um controlador Java.
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.
fonte
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 .... .
fonte