Spring @RequestParam-混合命名的参数和Map <string,string>参数

时间:2019-04-01 14:26:51

标签: java spring spring-boot

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

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

如您所见,存在参数idname,以及以filter开头的多个参数。调用目标系统时,我需要从参数键中删除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>中的所有其他内容?还是还有其他可能性,例如使用正则表达式模式映射以filter开头的所有参数?

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

3 个答案:

答案 0 :(得分:1)

如果您关于仅使用通用映射的 问题只是Swagger是准确的,为什么不将@ApiImplicitParams annotation添加到端点?这可以让您指定Swagger输出中需要哪些参数:

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

答案 1 :(得分:0)

您可以上课,例如

@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 :(得分:0)

尝试

@RequestMapping
public String books(@RequestParam Map<String, String> requestParams, Other params)
{ 
     //Your code here
}