[英]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.