«1. Обзор

В этом руководстве мы рассмотрим аннотации Spring Web из пакета org.springframework.web.bind.annotation.

2. @RequestMapping

Проще говоря, @RequestMapping помечает методы обработчика запросов внутри классов @Controller; его можно настроить, используя:

    путь или его псевдонимы, имя и значение: какой URL-адрес метода сопоставлен с методом: параметры совместимых методов HTTP: фильтрует запросы на основе наличия, отсутствия или значения параметров HTTP заголовки: фильтры запросы, основанные на наличии, отсутствии или значении HTTP-заголовков. выглядит так:

Мы можем предоставить настройки по умолчанию для всех методов обработчика в классе @Controller, если применим эту аннотацию на уровне класса. Единственным исключением является URL-адрес, который Spring не переопределяет с помощью настроек уровня метода, а добавляет две части пути.

@Controller
class VehicleController {

    @RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
    String home() {
        return "home";
    }
}

Например, следующая конфигурация имеет тот же эффект, что и предыдущая:

Более того, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping и @PatchMapping — это разные варианты @RequestMapping с HTTP уже установлен метод GET, POST, PUT, DELETE и PATCH соответственно.

@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {

    @RequestMapping("/home")
    String home() {
        return "home";
    }
}

Они доступны начиная с выпуска Spring 4.3.

3. @RequestBody

Давайте перейдем к @RequestBody, который сопоставляет тело HTTP-запроса с объектом:

Десериализация выполняется автоматически и зависит от типа содержимого запроса. .

@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
    // ...
}

4. @PathVariable

Далее поговорим о @PathVariable.

Эта аннотация указывает, что аргумент метода привязан к переменной шаблона URI. Мы можем указать шаблон URI с помощью аннотации @RequestMapping и привязать аргумент метода к одной из частей шаблона с помощью @PathVariable.

Мы можем добиться этого с помощью имени или его псевдонима, аргумента значения:

Если имя части в шаблоне совпадает с именем аргумента метода, мы не должны указывать его в аннотация:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
    // ...
}

Кроме того, мы можем пометить переменную пути как необязательную, установив для аргумента required значение false:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
    // ...
}

5. @RequestParam

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
    // ...
}

Мы используем @RequestParam для доступа к параметрам HTTP-запроса: ~ ~~

Он имеет те же параметры конфигурации, что и аннотация @PathVariable.

@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
    // ...
}

В дополнение к этим настройкам, с помощью @RequestParam мы можем указать введенное значение, когда Spring не находит пустое значение в запросе. Для этого мы должны установить аргумент defaultValue.

Предоставление значения по умолчанию неявно устанавливает для required значение false:

Помимо параметров, есть и другие части HTTP-запроса, к которым мы можем получить доступ: файлы cookie и заголовки. Мы можем получить к ним доступ с помощью аннотаций @CookieValue и @RequestHeader соответственно.

@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
    // ...
}

Мы можем настроить их так же, как @RequestParam.

6. Аннотации обработки ответов

В следующих разделах мы увидим наиболее распространенные аннотации для управления HTTP-ответами в Spring MVC.

6.1. @ResponseBody

Если мы пометим метод обработчика запросов с помощью @ResponseBody, Spring обрабатывает результат метода как сам ответ:

Если мы аннотируем класс @Controller этой аннотацией, все методы обработчика запросов будут используй это.

@ResponseBody
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

6.2. @ExceptionHandler

С помощью этой аннотации мы можем объявить собственный метод обработчика ошибок. Spring вызывает этот метод, когда метод обработчика запросов выдает любое из указанных исключений.

Перехваченное исключение можно передать методу в качестве аргумента:

6.3. @ResponseStatus

@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

Мы можем указать желаемый HTTP-статус ответа, если аннотируем метод обработчика запроса этой аннотацией. Мы можем объявить код состояния с аргументом кода или его псевдонимом, аргументом значения.

Кроме того, мы можем указать причину, используя аргумент Reason.

Мы также можем использовать его вместе с @ExceptionHandler:

Для получения дополнительной информации о статусе ответа HTTP, пожалуйста, посетите эту статью.

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

7. Другие веб-аннотации

«Некоторые аннотации не управляют HTTP-запросами или ответами напрямую. В следующих разделах мы представим наиболее распространенные из них.

7.1. @Controller

Мы можем определить контроллер Spring MVC с помощью @Controller. Для получения дополнительной информации, пожалуйста, посетите нашу статью об аннотациях Spring Bean.

7.2. @RestController

@RestController объединяет @Controller и @ResponseBody.

Следовательно, следующие объявления эквивалентны:

@Controller
@ResponseBody
class VehicleRestController {
    // ...
}
@RestController
class VehicleRestController {
    // ...
}

7.3. @ModelAttribute

С помощью этой аннотации мы можем получить доступ к элементам, которые уже находятся в модели MVC @Controller, предоставив ключ модели:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
    // ...
}

Как и в случае с @PathVariable и @RequestParam, нам не нужно укажите ключ модели, если аргумент имеет такое же имя:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
    // ...
}

Кроме того, @ModelAttribute имеет другое применение: если мы аннотируем им метод, Spring автоматически добавит возвращаемое значение метода в модель:

@ModelAttribute("vehicle")
Vehicle getVehicle() {
    // ...
}

~ ~~ Как и раньше, нам не нужно указывать ключ модели, Spring по умолчанию использует имя метода:

@ModelAttribute
Vehicle vehicle() {
    // ...
}

Прежде чем Spring вызовет метод обработчика запроса, он вызывает все аннотированные @ModelAttribute методы в классе.

Более подробную информацию о @ModelAttribute можно найти в этой статье.

7.4. @CrossOrigin

@CrossOrigin обеспечивает междоменную связь для аннотированных методов обработчика запросов:

@CrossOrigin
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

Если мы помечаем им класс, он применяется ко всем методам обработчика запросов в нем.

Мы можем точно настроить поведение CORS с помощью аргументов этой аннотации.

Для получения более подробной информации, пожалуйста, посетите эту статью.

8. Заключение

В этой статье мы увидели, как мы можем обрабатывать HTTP-запросы и ответы с помощью Spring MVC.

Как обычно, примеры доступны на GitHub.

Next »

Spring Boot Annotations

« Previous

Spring Core Annotations