简体   繁体   中英

How do I handle an unknown number of RequestParams in Spring Boot REST?

I have a REST api in Spring Boot:

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

    return something;
}

This endpoint can be requested with up to 10 RequestParams. I know of course all of the 10 possible RequestParams, however client can chose to request with anywhere between 0 to all 10 of the RequestParams.

Now I need a way to handle this without plugging all 10 RequestParams in as parameters in the getData() method. Is it not possible to register all possible RequestParams in a class, and the use that class as parameter ing the getData()?

Something like this:

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

And then

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

    return something;
}

Please note: The parameters can be different types (String, int, Set, etc.) therefore the following solution comes very close but does not solve it because the map requires a consistent value type: how to capture multiple parameters using @RequestParam using spring mvc?

One way to do that would be receive a Map with the params, the problem is that all the params would have the same type, and you would have to cast to the proper type in your code:

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

You can define all parameters in your method and set them as ' not required '.

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

Then you can choose which parameters to define in your url. The others are null. Or you define a default-value in the RequestParam -Annotation.

you can use @RequestBody annotation. It will map the HttpRequest body to class object. As spring boot has jackson in its classpath, it will do automatic deserialization of the inbound HttpRequest body onto a Java object.

public class ParamClass {
 String paramOne;
 String paramTwo;
 ....
 String paramTem;
 
 // default constructor
 
 // all getters
 // all setters

}

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

    return something;
}

Client should send json data to the api /test

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM