有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaspring@RequestParam混合命名params和Map<String,String>params

我正在编写一个Spring引导应用程序,它通过REST端点接收参数并将它们转发到另一个系统。收到的参数包含一些已知字段,但也可能包含多个变量字段,以filter开头,后跟未定义的名称:

example.com?id=1&name=foo&filter1=2&filterA=B&[...]&filterWhatever=something

如您所见,有两个参数idname,以及多个以filter开头的参数。调用目标系统时,我需要从param键中删除filter,并将其后的所有内容用作键:

targetsystem.com?id=1&name=foo&1=2&A=B&[...]&whatever=something(不再筛选密钥)

这本身不是问题,我只需@RequestParam Map<String, String> params,流式/循环参数,并根据需要修改即可。但使用Swagger作为API文档工具,我想列出所有已知参数,以便客户机可以看到实际支持的参数

我尝试混合命名参数并捕获所有参数,但它无法识别处理程序:

myEndpoint(final @RequestParam String id, final @RequestParam String name, final @RequestParam Map<String, String> remainingParams)

是否可以映射特定参数并捕获Map<String,String>中的所有其他内容?或者还有其他可能性,比如使用regex模式映射所有以filter开头的参数

不幸的是,我无法更改源系统和目标系统


共 (3) 个答案

  1. # 1 楼答案

    你可以去上课

    @Data
    public class Paramss {
    
        @NotNull
        private String a;
        private String b;
    }
    

    然后

    @GetMapping
    public Object params( @Valid @ModelAttribute Paramss params ) {
        return params;
    }
    

    另见:Spring @RequestParam with class

  2. # 2 楼答案

    试试看

    @RequestMapping
    public String books(@RequestParam Map<String, String> requestParams, Other params)
    { 
         //Your code here
    }
    
  3. # 3 楼答案

    如果你的对使用通用映射的关注仅仅是虚张声势地表示准确,那么为什么不直接将@ApiImplicitParamsannotation添加到你的端点呢?这将允许您指定在Swagger输出中需要哪些参数:

    @ApiImplicitParams(value = {
       @ApiImplicitParam(name = "name", type = "String", required = true, paramType = "query"),
       @ApiImplicitParam(name = "id", type = "String", required = true, paramType = "query")
    })