Spring @RequestMapping Новые ярлыки аннотаций
1. обзор
Весна 4.3. introduced - очень интересные аннотации, составленные на уровне методов, чтобы сгладить обработку@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 и соответствующим значением в элементеmethod.
Например, если мы посмотрим на исходный код аннотации@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, и т. д.
Полный исходный код аннотаций доступенhere.
4. Реализация
Давайте попробуем использовать эти аннотации для быстрого создания REST-приложения.
Обратите внимание: поскольку мы будем использовать Maven для сборки проекта и Spring MVC для создания нашего приложения, нам нужно добавить необходимые зависимости вpom.xml:
org.springframework
spring-webmvc
4.3.6.RELEASE
Последняя версияspring-webmvc доступна вCentral Maven Repository.
Теперь нам нужно создать контроллер для сопоставления URL входящего запроса. Внутри этого контроллера мы будем использовать все эти аннотации одну за другой.
4.1. @GetMappingс
@GetMapping("/get")
public @ResponseBody ResponseEntity get() {
return new ResponseEntity("GET Response", HttpStatus.OK);
}
@GetMapping("/get/{id}")
public @ResponseBody ResponseEntity
getById(@PathVariable String id) {
return new ResponseEntity("GET Response : "
+ id, HttpStatus.OK);
}
4.2. @PostMappingс
@PostMapping("/post")
public @ResponseBody ResponseEntity post() {
return new ResponseEntity("POST Response", HttpStatus.OK);
}
4.3. @PutMappingс
@PutMapping("/put")
public @ResponseBody ResponseEntity put() {
return new ResponseEntity("PUT Response", HttpStatus.OK);
}
4.4. @DeleteMappingс
@DeleteMapping("/delete")
public @ResponseBody ResponseEntity delete() {
return new ResponseEntity("DELETE Response", HttpStatus.OK);
}
4.5. @PatchMappingс
@PatchMapping("/patch")
public @ResponseBody ResponseEntity patch() {
return new ResponseEntity("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», как только мы попадаем в URLGET «/ 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. We can utilize these quick shortcuts to create a clean code base.
Как всегда, вы можете найти исходный код этого руководства в папкеGithub project.