Jak korzystać z wielu adnotacji @RequestMapping na wiosnę?

247

Czy można zastosować wiele @RequestMappingadnotacji w metodzie?

Lubić :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}
wuntee
źródło

Odpowiedzi:

436

@RequestMappingma String[]parametr wartości, więc powinieneś być w stanie podać wiele takich wartości:

@RequestMapping(value={"", "/", "welcome"})

Ed Brannin
źródło
2
To powiedziawszy, mam problem z uruchomieniem wartości „” lub „/” w mojej aplikacji. Czy oni pracują dla ciebie?
Ed Brannin,
Czy istnieje sposób na powiązanie różnych widoków sukcesu i widoków formularza z każdym adresem URL żądania za pomocą wielu adnotacji?
k-den
@EdBrannin Potrzebuję wielu do użycia, niestandardowego, nagłówka, konsumuje, parametrów itp.
deFreitas
Chciałbym również wiedzieć, skąd mam wiedzieć, które mapowanie żądań zostało wywołane. czy to jest mile widziane?
Siddharth
1
@Siddharth 1. Możliwe, że możesz dodać i sprawdzić parametr typu HttpRequest. 2. Jeśli naprawdę zależy Ci na wywołaniu mapowania, być może nie korzystaj z tej techniki. ;)
Ed Brannin
24

Z mojego testu (wiosna 3.0.5) @RequestMapping(value={"", "/"}) - "/"działa tylko , ""nie działa. Jednak okazało się, że to działa: @RequestMapping(value={"/", " * "})Z " * "niczego zapałki, więc będzie to domyślny obsługi w przypadku braku innych.

Alan Zhong
źródło
13

Nie trzeba. Adnotacja RequestMapping obsługuje symbole wieloznaczne i ścieżki w stylu ant. Wygląda również tak, jakbyś chciał tylko domyślnego widoku, abyś mógł go umieścić

<mvc:view-controller path="/" view-name="welcome"/>

w twoim pliku konfiguracyjnym. Spowoduje to przekazanie wszystkich żądań do katalogu głównego do widoku powitalnego.

Robby Pond
źródło
Czy powinno być coś między tymi dwiema liniami? Korzystam z FreeMarkerViewResolver - więc musiałbym pójść tą drogą ... Chyba mógłbym po prostu stworzyć wiele ViewResolver.
wuntee
2
Nie zapewnia elastyczności zapewnianej przez wiele adnotacji RequestMapping. Na przykład, jeśli chcę, aby jedna metoda obsługiwała wartość „/ a” z POST lub wartość „/ b” z GET. Oczywiście obejście jest dość łatwe (refaktoryzacja funkcjonalności w trzeciej metodzie), ale wystarczy powiedzieć, że byłoby to przydatne.
simon
1

Najkrótsza droga to: @RequestMapping({"", "/", "welcome"})

Chociaż możesz także:

  • @RequestMapping(value={"", "/", "welcome"})
  • @RequestMapping(path={"", "/", "welcome"})
Marco
źródło
1

Obecnie korzystanie z Spring-Boot 2.0.4 - {} nie będzie działać.

@RequestMapping

nadal ma String [] jako parametr wartości, więc deklaracja wygląda następująco:

 @RequestMapping(value=["/","/index","/login","/home"], method = RequestMethod.GET)

** Aktualizacja - działa z Spring-Boot 2.2 **

 @RequestMapping(value={"/","/index","/login","/home"}, method = RequestMethod.GET)
Sokół
źródło
Nawiasy kwadratowe są nieprawidłowe.
Poprawną
@ luis.espinal Nawiasy kwadratowe działały z wersją 2.0.4 Spring-Boot. Zaktualizuję swój post.
Falcon,
0

Dopuszczalne są również:

@GetMapping(path = { "/{pathVariable1}/{pathVariable1}/somePath", 
                     "/fixedPath/{some-name}/{some-id}/fixed" }, 
            produces = "application/json")

To samo można zastosować do @RequestMappingjak dobrze

Pritam Banerjee
źródło
-2

Lepiej jest używać adnotacji PathVariable, jeśli nadal chcesz uzyskać wywołany identyfikator URI.

@PostMapping("/pub/{action:a|b|c}")
public JSONObject handlexxx(@PathVariable String action, @RequestBody String reqStr){
...
}

lub parsuj go z obiektu żądania.

CQLI
źródło