Весняні веб-анотації

Ця стаття є частиною серії: • Весняні основні анотації

• Весняні веб-анотації (поточна стаття) • Анотації весняного завантаження

• Анотації весняного планування

• Анотації весняних даних

• Анотації весняних бобів

1. Огляд

У цьому посібнику ми розглянемо анотації Spring Web з пакета org.springframework.web.bind.annotation .

2. @RequestMapping

Простіше кажучи, @RequestMapping позначає методи обробки запитів усередині класів @Controller ; його можна налаштувати за допомогою:

  • path, або його псевдоніми, ім'я та значення: на яку URL-адресу призначається метод
  • метод: сумісні методи HTTP
  • params: фільтрує запити на основі наявності, відсутності або значення параметрів HTTP
  • заголовки: фільтрує запити на основі наявності, відсутності або значення заголовків HTTP
  • споживає: типи носіїв, які метод може використовувати в тілі запиту HTTP
  • виробляє: типи носіїв, які метод може створити в тілі відповіді HTTP

Ось короткий приклад того, як це виглядає:

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

Ми можемо надати налаштування за замовчуванням для всіх методів обробника в класі @Controller, якщо застосувати цю анотацію на рівні класу. Єдиним винятком є ​​URL-адреса, яка Spring не замінить налаштування рівня методу, а додає дві частини шляху.

Наприклад, наступна конфігурація має такий самий ефект, як і наведена вище:

@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 відповідно.

Вони доступні з випуску 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) { // ... }

Якщо ім'я частини в шаблоні відповідає імені аргументу методу, нам не потрібно вказувати його в анотації:

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

Більше того, ми можемо позначити змінну шляху необов’язковою, встановивши аргумент, необхідний як false:

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

5. @RequestParam

Ми використовуємо @RequestParam для доступу до параметрів запиту HTTP :

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

Він має ті самі параметри конфігурації, що і анотація @PathVariable .

На додаток до цих налаштувань, за допомогою @RequestParam ми можемо вказати вставлене значення, коли Spring не знаходить або порожнє значення у запиті. Для цього нам потрібно встановити аргумент defaultValue .

Надання значення за замовчуванням неявно встановлює необхідне для FALSE:

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

Окрім параметрів, є й інші частини запиту HTTP, до яких ми можемо отримати доступ: файли cookie та заголовки . Ми можемо отримати до них доступ за допомогою анотацій @CookieValue та @RequestHeader відповідно.

Ми можемо налаштувати їх так само, як @RequestParam .

6. Анотації щодо обробки відповідей

У наступних розділах ми побачимо найпоширеніші анотації для маніпулювання відповідями HTTP у Spring MVC.

6.1. @ResponseBody

Якщо ми позначимо метод обробника запиту @ResponseBody, Spring сприйме результат методу як саму відповідь :

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

Якщо ми анотуємо клас @Controller цією анотацією, усі методи обробки запитів використовуватимуть його.

6.2. @ExceptionHandler

За допомогою цієї анотації ми можемо оголосити власний метод обробника помилок . Spring викликає цей метод, коли метод обробника запиту видає будь-який із зазначених винятків.

Вилучений виняток може бути переданий методу як аргумент:

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

6.3. @ResponseStatus

We can specify the desired HTTP status of the response if we annotate a request handler method with this annotation. We can declare the status code with the code argument, or its alias, the value argument.

Also, we can provide a reason using the reason argument.

We also can use it along with @ExceptionHandler:

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

For more information about HTTP response status, please visit this article.

7. Other Web Annotations

Some annotations don't manage HTTP requests or responses directly. In the next sections, we'll introduce the most common ones.

7.1. @Controller

We can define a Spring MVC controller with @Controller. For more information, please visit our article about Spring Bean Annotations.

7.2. @RestController

The @RestControllercombines @Controller and @ResponseBody.

Therefore, the following declarations are equivalent:

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

7.3. @ModelAttribute

With this annotation we can access elements that are already in the model of an MVC @Controller, by providing the model key:

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

Like with @PathVariable and @RequestParam, we don't have to specify the model key if the argument has the same name:

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

Besides, @ModelAttribute has another use: if we annotate a method with it, Spring will automatically add the method's return value to the model:

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

Like before, we don't have to specify the model key, Spring uses the method's name by default:

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

Before Spring calls a request handler method, it invokes all @ModelAttribute annotated methods in the class.

More information about @ModelAttribute can be found in this article.

7.4. @CrossOrigin

@CrossOriginenables cross-domain communication for the annotated request handler methods:

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

If we mark a class with it, it applies to all request handler methods in it.

We can fine-tune CORS behavior with this annotation's arguments.

Щоб отримати докладнішу інформацію, відвідайте цю статтю.

8. Висновок

У цій статті ми побачили, як ми можемо обробляти HTTP-запити та відповіді за допомогою Spring MVC.

Як зазвичай, приклади доступні на GitHub.

Далі » Анотації весняного завантаження « Попередні весняні анотації весни