Перейти к основному содержимому

Spring @RequestMapping Новые аннотации ярлыков

· 4 мин. чтения

1. Обзор

Весна 4.3. представил несколько очень крутых аннотаций, составленных на уровне методов, чтобы сгладить обработку @RequestMapping в типичных проектах Spring MVC.

В этой статье мы узнаем, как использовать их эффективно.

2. Новые аннотации

Как правило, если мы хотим реализовать обработчик URL-адресов, используя традиционную аннотацию @RequestMapping , это будет примерно так:

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)

Новый подход позволяет сократить это просто до:

@GetMapping("/get/{id}")

В настоящее время Spring поддерживает пять типов встроенных аннотаций для обработки различных типов методов входящего HTTP-запроса: GET, POST, PUT, DELETE и PATCH . Эти аннотации:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

Из соглашения об именах видно, что каждая аннотация предназначена для обработки соответствующего типа метода входящего запроса, т . е . @GetMapping используется для обработки метода запроса типа GET , @PostMapping используется для обработки метода запроса типа POST и т. д.

3. Как это работает

Все вышеперечисленные аннотации уже снабжены внутренней аннотацией @RequestMapping и соответствующим значением в элементе метода .

Например, если мы посмотрим на исходный код аннотации @GetMapping , мы увидим, что он уже аннотирован с помощью RequestMethod.GET следующим образом:

@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = { RequestMethod.GET })
public @interface GetMapping {
// abstract codes
}

Все остальные аннотации создаются таким же образом, т.е. @PostMapping аннотируется RequestMethod.POST , @PutMapping аннотируется RequestMethod.PUT и т. д.

Полный исходный код аннотаций доступен здесь .

4. Реализация

Давайте попробуем использовать эти аннотации для создания быстрого REST-приложения.

Обратите внимание, что, поскольку мы будем использовать Maven для сборки проекта и Spring MVC для создания нашего приложения, нам нужно добавить необходимые зависимости в pom.xml:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>

Последняя версия spring-webmvc доступна в Центральном репозитории Maven .

Теперь нам нужно создать контроллер для сопоставления URL-адреса входящего запроса. Внутри этого контроллера мы будем использовать все эти аннотации одну за другой.

4.1. @GetMapping

@GetMapping("/get")
public @ResponseBody ResponseEntity<String> get() {
return new ResponseEntity<String>("GET Response", HttpStatus.OK);
}
@GetMapping("/get/{id}")
public @ResponseBody ResponseEntity<String>
getById(@PathVariable String id) {
return new ResponseEntity<String>("GET Response : "
+ id, HttpStatus.OK);
}

4.2. @PostMapping

@PostMapping("/post")
public @ResponseBody ResponseEntity<String> post() {
return new ResponseEntity<String>("POST Response", HttpStatus.OK);
}

4.3. @PutMapping

@PutMapping("/put")
public @ResponseBody ResponseEntity<String> put() {
return new ResponseEntity<String>("PUT Response", HttpStatus.OK);
}

4.4. @DeleteMapping

@DeleteMapping("/delete")
public @ResponseBody ResponseEntity<String> delete() {
return new ResponseEntity<String>("DELETE Response", HttpStatus.OK);
}

4.5. @PatchMapping

@PatchMapping("/patch")
public @ResponseBody ResponseEntity<String> patch() {
return new ResponseEntity<String>("PATCH Response", HttpStatus.OK);
}

Обратите внимание:

  • Мы использовали необходимые аннотации для правильной обработки входящих HTTP-методов с URI . Например, @GetMapping для обработки URI «/get», @PostMapping для обработки URI «/post» и т . д. ``
  • Поскольку мы делаем приложение на основе REST, мы возвращаем постоянную строку (уникальную для каждого типа запроса) с кодом ответа 200, чтобы упростить приложение. В этом случае мы использовали аннотацию Spring @ResponseBody .
  • Если бы нам пришлось обрабатывать любую переменную URL-пути, мы могли бы просто сделать это гораздо проще, чем раньше, в случае использования @RequestMapping.

5. Тестирование приложения

Чтобы протестировать приложение, нам нужно создать пару тестовых случаев с помощью JUnit. Мы будем использовать SpringJUnit4ClassRunner для запуска тестового класса. Мы создадим пять разных тестовых случаев для проверки каждой аннотации и каждого обработчика, объявленного нами в контроллере.

Давайте упростим тестовый пример @GetMapping:

@Test 
public void giventUrl_whenGetRequest_thenFindGetResponse()
throws Exception {

MockHttpServletRequestBuilder builder = MockMvcRequestBuilders
.get("/get");

ResultMatcher contentMatcher = MockMvcResultMatchers.content()
.string("GET Response");

this.mockMvc.perform(builder).andExpect(contentMatcher)
.andExpect(MockMvcResultMatchers.status().isOk());

}

Как мы видим, мы ожидаем постоянную строку « GET Response », как только мы нажмем URL-адрес GET «/get».

Теперь давайте создадим тестовый пример для проверки @PostMapping :

@Test 
public void givenUrl_whenPostRequest_thenFindPostResponse()
throws Exception {

MockHttpServletRequestBuilder builder = MockMvcRequestBuilders
.post("/post");

ResultMatcher contentMatcher = MockMvcResultMatchers.content()
.string("POST Response");

this.mockMvc.perform(builder).andExpect(contentMatcher)
.andExpect(MockMvcResultMatchers.status().isOk());

}

Таким же образом мы создали остальные тестовые примеры для проверки всех методов HTTP.

Кроме того, мы всегда можем использовать любой обычный клиент REST, например, PostMan, RESTClient и т. д., для тестирования нашего приложения. В этом случае нам нужно быть немного осторожными, чтобы выбрать правильный тип метода HTTP при использовании остального клиента. В противном случае он выдаст статус ошибки 405.

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

В этой статье мы кратко познакомились с различными типами ярлыков @RequestMapping для быстрой веб-разработки с использованием традиционной среды Spring MVC. Мы можем использовать эти быстрые ярлыки для создания чистой базы кода.

Как всегда, вы можете найти исходный код этого туториала в проекте Github .