如何在spring引导rest中处理未知数量的requestparams?

xoshrz7s  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(333)

我在spring boot中有一个rest api:

@GetMapping("/test")
public MyClass getData() { 

    return something;
}

最多可以使用10个requestparams请求此端点。我当然知道所有10个可能的requestparams,但是客户端可以选择使用0到所有10个requestparams之间的任意位置进行请求。
现在我需要一种方法来处理这个问题,而不需要将所有10个requestparams作为getdata()方法中的参数插入。是否不可能在一个类中注册所有可能的requestparams,并将该类用作getdata()的参数?
大概是这样的:

public class ParamClass {
    private @RequestParam("ParamOne") String ParamOne;
    private @RequestParam("ParamTwo") Set<String> ParamTwo;
    private @RequestParam("ParamThree") Integer ParamThree;
}

然后

@GetMapping("/test")
public MyClass getData(@RequestParam ParamClass params) { 

    return something;
}

请注意:参数可以是不同的类型(字符串、int、set等),因此下面的解决方案非常接近,但无法解决它,因为Map需要一致的值类型:如何使用spring mvc使用@requestparam捕获多个参数?

wribegjk

wribegjk1#

一种方法是接收带有参数的Map,问题是所有参数都具有相同的类型,您必须在代码中强制转换为正确的类型:

@ResponseBody
public String updateFoos(@RequestParam Map<String,Object> allParams) {
    return "Parameters are " + allParams.entrySet();
}
67up9zun

67up9zun2#

您可以在方法中定义所有参数并将其设置为“非必需”。

@GetMapping("/test")
public MyClass getData(@RequestParam(name="p1", required=false) String p1,
    @RequestParam(name="p2", required=false) Integer p2,
    ...) { 
    return something;
}

然后,您可以选择在url中定义哪些参数。其他的都是空的。或者在中定义默认值 RequestParam -注解。

2w3rbyxf

2w3rbyxf3#

您可以使用@requestbody注解。它将httprequest主体Map到类对象。由于SpringBoot的类路径中有jackson,它将自动反序列化入站httprequest主体到java对象上。

public class ParamClass {
 String paramOne;
 String paramTwo;
 ....
 String paramTem;

 // default constructor

 // all getters
 // all setters

}

@GetMapping("/test")
public MyClass getData(@RequestBody ParamClass params) { 

    return something;
}

客户端应将json数据发送到api/测试

相关问题