@RequestParam с любым значением - PullRequest
       31

@RequestParam с любым значением

2 голосов
/ 19 февраля 2020

В моем @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;
}

Этот метод позволяет обрабатывать следующие GET-запросы:

GET:   /customers/
GET:   /customers?email=emai@email.com
GET:   /customers?phone=8-812-872-23-34

Но при необходимости добавить еще несколько параметров для запрос. Если это будет 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 .....
}

Есть ли способ использовать @ RequestParam-value в теле метода?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2020

@ RequestParam

Когда аннотация @RequestParam объявляется как Map или MultiValueMap, без имени параметра, указанного в аннотации, тогда карта заполняется запросом Значения параметров для каждого заданного имени параметра.

@GetMapping
public List<User> getByParameterOrAll(@RequestParam Map<String, String> parameters){ 
....
}

предоставит вам все параметры и значения в виде карты.

2 голосов
/ 19 февраля 2020

Вы не можете использовать один @RequestParam для другого имени-значения в запросе. Другим способом для вас может быть получение всех @RequestParam запроса, например this aswer

1 голос
/ 19 февраля 2020

Вы можете просто добавить HttpServletRequest в качестве параметра метода, и Spring предоставит его вам:

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

Затем вы можете использовать API HttpServletRequest для получения списка переданных параметров:

request.getParameterNames() или request.getParameterMap()

См. Документы здесь:

https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameterMap ()

...