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

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.