Ich habe die folgende Methode in meinem @ 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;
}

Diese Methode ermöglicht die Verarbeitung folgender GET-Anforderungen:

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

Fügen Sie jedoch bei Bedarf weitere Parameter für die Anforderung hinzu. Wenn es 10 oder ... 20 Parameter sein werden, kommt der Körper der obigen Methode unverschämt an! Wenn es eine Möglichkeit gibt, den Wert von @RequestParam an den Methodenkörper zu übergeben, könnte ich zum Beispiel Folgendes realisieren:

@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 .....
}

Gibt es eine Möglichkeit, den @ RequestParam-Wert im Methodenkörper zu verwenden?

2
Andrew 19 Feb. 2020 im 19:13

3 Antworten

Sie können kein einzelnes @RequestParam für einen anderen Namenswert in der Anforderung verwenden. Eine andere Möglichkeit für Sie besteht darin, alle @RequestParam der Anfrage wie diese Antwort

2
salvatore rinaudo 19 Feb. 2020 im 16:32

@RequestParam

Wenn eine @ RequestParam-Annotation als Map oder MultiValueMap deklariert wird, ohne dass in der Annotation ein Parametername angegeben ist, wird die Map mit den Anforderungsparameterwerten für jeden angegebenen Parameternamen gefüllt.

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

Sie erhalten alle Parameter und Werte als Karte.

4
R.G 19 Feb. 2020 im 16:27

Sie können einfach HttpServletRequest als Methodenparameter hinzufügen und Spring gibt es Ihnen:

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

Anschließend können Sie die HttpServletRequest-API verwenden, um die Liste der übergebenen Parameter abzurufen:

request.getParameterNames() oder request.getParameterMap()

Siehe die Dokumente hier:

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

1
mikeb 19 Feb. 2020 im 16:19