1. 概述
Spring 4.3. 引入 了一些非常酷的元註解,以簡化典型 Spring MVC 項目中 @RequestMapping 的處理。
在本文中,我們將學習如何以高效的方式使用它們。
2. 新註解
通常,如果我們想使用傳統的 @RequestMapping 註解來實現 URL 處理程序,它會像這樣:
@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 等。
完整的註解源代碼可以在 這裏 找到。
4. Implementation
讓我們嘗試使用這些註解來構建一個快速的 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 用於處理 “/get” URI,@PostMapping 用於處理 “/post” URI,等等
- 由於我們正在構建一個基於 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 URL “/get” 時,會返回一個常量字符串 “GET Response”。
現在,讓我們創建一個測試用例來測試 @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 等來測試我們的應用程序。 在這種情況下,我們需要在使用 REST 客户端時仔細選擇正確的 HTTP 方法類型。 否則,它將返回 405 錯誤狀態。
6. 結論
在本文中,我們對不同類型的 @RequestMapping 快捷方式進行了快速介紹,用於使用傳統的 Spring MVC 框架進行快速 Web 開發。