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 .