簡體   English   中英

如何使用 Spring 基於查詢參數鍵和值進行過濾

[英]How to filter based on query parameter key and value with Spring

我們的應用程序按月或按季度將工作提交給另一個服務。 我們有一個 API 允許我們觸發以下場景之一:

  1. 使用其 ID 提交單個作業
  2. 提交計划每月運行的所有作業
  3. 提交計划在每個季度運行的所有作業

目前我們有 3 個不同的 API 端點用於 3 個場景,但想更新 API 以使用類似於以下的結構:

  1. /submit?type=single&id=123
  2. /submit?type=all&frequency=monthly
  3. /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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM