«1. Обзор

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

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

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

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

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

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

@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);
}

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

4.2. @PostMapping

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

4.3. @PutMapping

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

4.4. @DeleteMapping

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

4.5. @PatchMapping

    Примечания:

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

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

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

@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());

}

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

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

@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());
	
}

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

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

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

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

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