Spring Web Annotations

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.