Java @具有任意值的RequestParam

Java @具有任意值的RequestParam,java,spring,rest,spring-restcontroller,http-request-parameters,Java,Spring,Rest,Spring Restcontroller,Http Request Parameters,我在@Restcontroller中有以下方法: @GetMapping public List<User> getByParameterOrAll( @RequestParam(value = "email", required = false) String email, @RequestParam(value = "phone", required = false) String phone) { List<User> us

我在@Restcontroller中有以下方法:

@GetMapping
public List<User> getByParameterOrAll(
        @RequestParam(value = "email", required = false) String email,
        @RequestParam(value = "phone", required = false) String phone) {

    List<User> userList;
    if ((email != null && !email.isEmpty()) && (phone == null || phone.isEmpty())) {
        userList = super.getByEmail(email);
    } else if ((email == null || email.isEmpty()) && (phone != null)) {
        userList = super.getByPhone(phone);
    } else {
        userList = super.getAll();
    }
    return userList;
}
但如果有必要,可以为请求添加更多参数。如果是10或。。。20个参数,上面方法的主体横行! 如果有任何方法可以将@RequestParam的值传递给方法体,我可以实现,例如:

@GetMapping
public List<User> getByParameterOrAll(
        @RequestParam(value = "any", required = false) String any) {

    if (value=="email") {
        userList = super.getByEmail(email);
    } else if (value=="email") {
        userList = super.getByPhone(email);
    } else if .....
}
@GetMapping
公共列表getByParameterOrAll(
@RequestParam(value=“any”,required=false)字符串(any){
如果(值=“电子邮件”){
userList=super.getByEmail(电子邮件);
}else if(值=“电子邮件”){
userList=super.getByPhone(电子邮件);
}如果。。。。。
}

有没有办法在方法体中使用@RequestParam值?

您只需添加
HttpServletRequest
作为方法参数,Spring将为您提供:

@GetMapping
public List<User> getByParameterOrAll(@RequestParam(value = "email", required = false) 
String email,
                                      @RequestParam(value = "phone", required = false) 
String phone, HttpServletRequest request)
@GetMapping
公共列表getByParameterOrAll(@RequestParam(value=“email”,required=false)
字符串电子邮件,
@RequestParam(value=“phone”,required=false)
字符串电话,HttpServletRequest(请求)
然后,您可以使用HttpServletRequest API获取传递的参数列表:

request.getParameterNames()
request.getParameterMap()

请参见此处的文档:

将@RequestParam注释声明为映射时 或多值映射,但未指定参数名称 在注释中,然后使用请求填充映射 每个给定参数名称的参数值

@GetMapping
公共列表getByParameterOrAll(@RequestParam映射参数){
....
}

将以映射的形式获取所有参数和值。

您不能对请求中的不同名称值使用单个@RequestParam。另一种方法是检索请求的所有@RequestParam,如

OOP中的一个好做法是将参数封装在类中,并将类作为请求体发送到请求中。是。例如,作为一个对象,我的对象应该是一张地图,保留电子邮件和电话参数有意义吗?我不知道,这不是我的项目。我的猜测是否定的,因为它们不是必需的,但它确实说明了两者都可以。如果是我,我会把它们拿走。
@GetMapping
public List<User> getByParameterOrAll(@RequestParam(value = "email", required = false) 
String email,
                                      @RequestParam(value = "phone", required = false) 
String phone, HttpServletRequest request)
@GetMapping
public List<User> getByParameterOrAll(@RequestParam Map<String, String> parameters){ 
....
}