[英]How to filter based on query parameter key and value with Spring
我們的應用程序按月或按季度將工作提交給另一個服務。 我們有一個 API 允許我們觸發以下場景之一:
目前我們有 3 個不同的 API 端點用於 3 個場景,但想更新 API 以使用類似於以下的結構:
/submit?type=single&id=123
/submit?type=all&frequency=monthly
/submit?type=all&frequency=quarterly
我的問題是我們如何在 Controller class 中實現這種映射,以便 3 個 API 中的每一個都有自己的方法,由提供給它的鍵值唯一標識。
目前我們有 3 種類似如下的方法,這使得我們可以在 3 種方法之間共享 API 路徑,但根據params
值區分它們。 是否有類似的方法可以使用,允許我們根據查詢參數鍵和值進行過濾?
@PostMapping(value = "/submit", params = "monthly")
@ResponseStatus(HttpStatus.ACCEPTED)
public void submitAllMonthlyJobs() {
// Code
}
一種方法是使用一種方法來處理所有 3 個場景,在該方法中,我們根據查詢參數分叉到 3 個選項之一。 但我希望有一種更清潔的方法,讓 Spring 為我們處理這個問題。
謝謝你的幫助。
每個請求映射,如@RequestMapping
、 @GetMapping
、 @PostMapping
等,不僅可以通過path
過濾,還可以通過params
過濾。 具有三個映射的端點可能如下所示:
@RestController
public class JobEndpoint {
@PostMapping(path = "submit", params = "type=single")
public void submitSingleJob(@RequestParam("id") long id) {
System.out.println("submitting single job " + id);
}
@PostMapping(path = "submit", params = {"type=all", "frequency=monthly"})
public void submitMonthlyJobs() {
System.out.println("submitting monthly jobs");
}
@PostMapping(path = "submit", params = {"type=all", "frequency=quarterly"})
public void submitQuarterlyJobs() {
System.out.println("submitting quarterly jobs");
}
}
只是為了確保它有效:
@WebMvcTest
@ExtendWith(OutputCaptureExtension.class)
class JobEndpointTest {
@Autowired
private MockMvc mvc;
@Test
void submitSingleJob(CapturedOutput output) throws Exception {
mvc.perform(post("/submit?type=single&id=123")).andExpect(status().isOk());
assertThat(output).contains("submitting single job 123");
}
@Test
void submitMonthlyJobs(CapturedOutput output) throws Exception {
mvc.perform(post("/submit?type=all&frequency=monthly")).andExpect(status().isOk());
assertThat(output).contains("submitting monthly jobs");
}
@Test
void submitQuarterlyJobs(CapturedOutput output) throws Exception {
mvc.perform(post("/submit?type=all&frequency=quarterly")).andExpect(status().isOk());
assertThat(output).contains("submitting quarterly jobs");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.