Anotações do Spring Web
1. Visão geral
Neste tutorial, exploraremos as anotações do Spring Web do pacoteorg.springframework.web.bind.annotation.
2. @RequestMapping
Simplificando,@RequestMappingmarks request handler methods dentro das classes@Controller; ele pode ser configurado usando:
-
path, ou seus aliases,name, evalue: para qual URL o método está mapeado
-
Métodos HTTP compatíveis commethod:
-
params: filtra solicitações com base na presença, ausência ou valor dos parâmetros HTTP
-
headers: filtra as solicitações com base na presença, ausência ou valor dos cabeçalhos HTTP
-
consumes: quais tipos de mídia o método pode consumir no corpo da solicitação HTTP
-
produces: quais tipos de mídia o método pode produzir no corpo da resposta HTTP
Aqui está um exemplo rápido de como é:
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
Podemos fornecerdefault settings for all handler methods in a @Controller class se aplicarmos essa anotação no nível da classe. O únicoexception is the URL which Spring won’t override com configurações de nível de método, mas anexa as duas partes do caminho.
Por exemplo, a seguinte configuração tem o mesmo efeito que a acima:
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
Além disso,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping e@PatchMapping são variantes diferentes de@RequestMapping com o método HTTP já definido para GET, POST, PUT, DELETE e PATCH respectivamente.
Estes estão disponíveis desde o lançamento do Spring 4.3.
3. @RequestBody
Vamos passar para@RequestBody - que mapeiabody of the HTTP request to an object:
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
// ...
}
A desserialização é automática e depende do tipo de conteúdo da solicitação.
4. @PathVariable
A seguir, vamos falar sobre@PathVariable.
Esta anotação indica que amethod argument is bound to a URI template variable. Podemos especificar o modelo de URI com a anotação@RequestMapping e vincular um argumento de método a uma das partes do modelo com@PathVariable.
Podemos conseguir isso comname ou seu alias, o argumentovalue:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
// ...
}
Se o nome da parte no modelo corresponder ao nome do argumento do método, não precisamos especificá-lo na anotação:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}
Além disso, podemos marcar uma variável de caminho opcional definindo o argumentorequired como falso:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}
5. @RequestParam
Usamos@RequestParam paraaccessing HTTP request parameters:
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}
Possui as mesmas opções de configuração da anotação@PathVariable.
Além dessas configurações, com@RequestParam, podemos especificar um valor injetado quando o Spring encontra nenhum valor ou um valor vazio na solicitação. Para conseguir isso, temos que definir o argumentodefaultValue.
Fornecer um valor padrão define implicitamenterequired parafalse:
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}
Além dos parâmetros, existemother HTTP request parts we can access: cookies and headers. Podemos acessá-los com as anotações@CookieValue and @RequestHeader respectivamente.
Podemos configurá-los da mesma forma que@RequestParam.
6. Anotações de manipulação de resposta
Nas próximas seções, veremos as anotações mais comuns para manipular respostas HTTP no Spring MVC.
6.1. @ResponseBody
Se marcarmos um método de manipulador de solicitação com@ResponseBody,Spring treats the result of the method as the response itself:
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Se anotarmos uma classe@Controller com essa anotação, todos os métodos do manipulador de solicitação a usarão.
6.2. @ExceptionHandler
Com esta anotação, podemos declarar acustom error handler method. O Spring chama esse método quando um método manipulador de solicitação lança qualquer uma das exceções especificadas.
A exceção capturada pode ser transmitida ao método como um argumento:
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
6.3. @ResponseStatus
Podemos especificardesired HTTP status of the response se anotarmos um método de tratamento de solicitação com esta anotação. Podemos declarar o código de status com o argumentocode, ou seu alias, o argumentovalue.
Além disso, podemos fornecer uma razão usando o argumentoreason.
Também podemos usá-lo junto com@ExceptionHandler:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
Para obter mais informações sobre o status da resposta HTTP, visitethis article.
7. Outras anotações da Web
Algumas anotações não gerenciam solicitações ou respostas HTTP diretamente. Nas próximas seções, apresentaremos os mais comuns.
7.1. @Controller
Podemos definir um controlador Spring MVC com@Controller. Para obter mais informações, visiteour article about Spring Bean Annotations.
7.2. @RestController
O@RestControllercombines @Controller and @ResponseBody.
Portanto, as seguintes declarações são equivalentes:
@Controller
@ResponseBody
class VehicleRestController {
// ...
}
@RestController
class VehicleRestController {
// ...
}
7.3. @ModelAttribute
Com esta anotação, podemosaccess elements that are already in the model de um MVC@Controller,, fornecendo a chave do modelo:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
// ...
}
Como com@PathVariablee@RequestParam, não temos que especificar a chave do modelo se o argumento tiver o mesmo nome:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
// ...
}
Além disso,@ModelAttribute tem outro uso: se anotarmos um método com ele, Spring iráautomatically add the method’s return value to the model:
@ModelAttribute("vehicle")
Vehicle getVehicle() {
// ...
}
Como antes, não temos que especificar a chave do modelo, Spring usa o nome do método por padrão:
@ModelAttribute
Vehicle vehicle() {
// ...
}
Antes de Spring chamar um método manipulador de solicitação, ele invoca todos os métodos anotados@ModelAttribute na classe.
Mais informações sobre@ModelAttribute podem ser encontradas emthis article.
7.4. @CrossOrigin
@CrossOriginenables cross-domain communication para os métodos de manipulador de solicitação anotados:
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Se marcarmos uma classe com ela, ela se aplicará a todos os métodos manipuladores de solicitação nela.
Podemos ajustar o comportamento do CORS com os argumentos desta anotação.
Para obter mais detalhes, visitethis article.
8. Conclusão
Neste artigo, vimos como podemos lidar com solicitações e respostas HTTP com o Spring MVC.
Como de costume, os exemplos estão disponíveisover on GitHub.