Spring Web Annotations
1. обзор
В этом руководстве мы рассмотрим веб-аннотации Spring из пакетаorg.springframework.web.bind.annotation.
2. @RequestMappingс
Проще говоря,@RequestMappingmarks request handler methods внутри классов@Controller; его можно настроить с помощью:
-
path, или его псевдонимы,name, иvalue:, на какой URL-адрес сопоставлен метод
-
method: совместимые методы HTTP
-
params: фильтрует запросы на основе наличия, отсутствия или значения HTTP-параметров
-
headers: фильтрует запросы на основе наличия, отсутствия или значения заголовков HTTP
-
consumes:, какие типы мультимедиа метод может использовать в теле HTTP-запроса
-
produces:, какие типы носителей может создавать метод в теле ответа HTTP
Вот краткий пример того, как это выглядит:
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
Мы можем предоставитьdefault settings for all handler methods in a @Controller class, если применим эту аннотацию на уровне класса. Единственныйexception is the URL which Spring won’t override с настройками уровня метода, но добавляет две части пути.
Например, следующая конфигурация имеет тот же эффект, что и приведенная выше:
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
Более того,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping и@PatchMapping - это разные варианты@RequestMapping с методом HTTP, уже установленным на GET, POST, PUT, DELETE и PATCH соответственно.
Они доступны с весны 4.3 выпуска.
3. @RequestBodyс
Перейдем к@RequestBody, который отображаетbody of the HTTP request to an object:
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
// ...
}
Десериализация происходит автоматически и зависит от типа содержимого запроса.
4. @PathVariableс
Теперь поговорим о@PathVariable.
Эта аннотация указывает, что amethod argument is bound to a URI template variable. Мы можем указать шаблон URI с аннотацией@RequestMapping и привязать аргумент метода к одной из частей шаблона с помощью@PathVariable.
Мы можем добиться этого с помощьюname или его псевдонима, аргументаvalue:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
// ...
}
Если имя части в шаблоне совпадает с именем аргумента метода, нам не нужно указывать его в аннотации:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}
Более того, мы можем пометить переменную пути как необязательную, установив для аргументаrequired значение false:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}
5. @RequestParamс
Мы используем@RequestParam дляaccessing HTTP request parameters:
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}
Он имеет те же параметры конфигурации, что и аннотация@PathVariable.
В дополнение к этим настройкам с помощью@RequestParam мы можем указать введенное значение, когда Spring не находит в запросе значения или пустого значения. Для этого мы должны установить аргументdefaultValue.
Предоставление значения по умолчанию неявно устанавливаетrequired вfalse:
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}
Помимо параметров естьother HTTP request parts we can access: cookies and headers. Мы можем получить к ним доступ с помощью аннотаций@CookieValue and @RequestHeader соответственно.
Мы можем настроить их так же, как@RequestParam.
6. Аннотации по обработке ответов
В следующих разделах мы увидим наиболее распространенные аннотации для манипулирования HTTP-ответами в Spring MVC.
6.1. @ResponseBodyс
Если мы отметим метод обработчика запроса@ResponseBody,Spring treats the result of the method as the response itself:
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Если мы аннотируем класс@Controller этой аннотацией, все методы обработчика запросов будут использовать ее.
6.2. @ExceptionHandlerс
С помощью этой аннотации мы можем объявитьcustom error handler method. Spring вызывает этот метод, когда метод обработчика запроса выдает любое из указанных исключений.
Пойманное исключение может быть передано методу в качестве аргумента:
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
6.3. @ResponseStatusс
Мы можем указатьdesired HTTP status of the response, если мы аннотируем метод обработчика запроса этой аннотацией. Мы можем объявить код состояния с помощью аргументаcode или его псевдонима, аргументаvalue.
Кроме того, мы можем указать причину, используя аргументreason.
Мы также можем использовать его вместе с@ExceptionHandler:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
Для получения дополнительных сведений о статусе ответа HTTP посетитеthis article.
7. Другие веб-аннотации
Некоторые аннотации не управляют HTTP-запросами или ответами напрямую. В следующих разделах мы познакомим вас с наиболее распространенными.
7.1. @Controllerс
Мы можем определить контроллер Spring MVC с помощью@Controller. Для получения дополнительной информации посетитеour article about Spring Bean Annotations.
7.2. @RestControllerс
@RestControllercombines @Controller and @ResponseBody.
Следовательно, следующие объявления эквивалентны:
@Controller
@ResponseBody
class VehicleRestController {
// ...
}
@RestController
class VehicleRestController {
// ...
}
7.3. @ModelAttributeс
С помощью этой аннотации мы можемaccess elements that are already in the model из MVC@Controller,, предоставив ключ модели:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
// ...
}
Как и в случае с@PathVariable и@RequestParam, нам не нужно указывать ключ модели, если аргумент имеет то же имя:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
// ...
}
Кроме того,@ModelAttribute имеет другое применение: если мы аннотируем метод с его помощью, Spring будетautomatically add the method’s return value to the model:
@ModelAttribute("vehicle")
Vehicle getVehicle() {
// ...
}
Как и раньше, нам не нужно указывать ключ модели, Spring по умолчанию использует имя метода:
@ModelAttribute
Vehicle vehicle() {
// ...
}
Прежде чем Spring вызовет метод обработчика запросов, он вызывает все аннотированные методы@ModelAttribute в классе.
Более подробную информацию о@ModelAttribute можно найти вthis article.
7.4. @CrossOriginс
@CrossOriginenables cross-domain communication для аннотированных методов обработчика запросов:
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Если мы помечаем класс этим, он применяется ко всем методам обработчика запросов в нем.
Мы можем точно настроить поведение CORS с помощью аргументов этой аннотации.
Для получения дополнительной информации посетитеthis article.
8. Заключение
В этой статье мы увидели, как мы можем обрабатывать HTTP-запросы и ответы с помощью Spring MVC.
Как обычно доступны примерыover on GitHub.