Kann @PathVariable null zurückgeben, wenn es nicht gefunden wird?
-
14-11-2019 - |
Frage
Ist es möglich, das zu machen? @PathVariable
Null zurückgeben, wenn die Pfadvariable nicht in der URL enthalten ist?Ansonsten muss ich zwei Handler erstellen.Eins für /simple
und noch einer für /simple/{game}
, aber beide machen das Gleiche, nur wenn kein Spiel definiert ist, wähle ich das erste aus einer Liste aus. Wenn jedoch ein Spielparameter definiert ist, verwende ich ihn.
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable("example") String example,
HttpServletRequest request) {
Und das ist es, was ich bekomme, wenn ich versuche, die Seite zu öffnen /simple
:
Verursacht durch:java.lang.IllegalStateException:@PathVariable [Beispiel] konnte in @RequestMapping nicht gefunden werden
Lösung
Sie können nicht optional sein, nein.Wenn Sie das brauchen, benötigen Sie zwei Methoden, um damit umzugehen.
Dies spiegelt die Natur von Pfadvariablen wider – es macht keinen Sinn, dass sie null sind.URLs im REST-Stil benötigen immer den vollständigen URL-Pfad.Wenn Sie über eine optionale Komponente verfügen, sollten Sie erwägen, sie stattdessen zu einem Anforderungsparameter zu machen (d. h.verwenden @RequestParam
).Dies eignet sich viel besser für optionale Argumente.
Andere Tipps
Wie andere bereits erwähnt haben: Nein, Sie können nicht erwarten, dass sie null sind, wenn Sie die Pfadparameter explizit erwähnt haben.Als Workaround können Sie jedoch Folgendes tun:
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Map<String, String> pathVariablesMap,
HttpServletRequest request) {
if (pathVariablesMap.containsKey("game")) {
//corresponds to path "/simple/{game}"
} else {
//corresponds to path "/simple"
}
}
Wenn Sie Spring 4.1 und Java 8 verwenden, können Sie java.util.Optional verwenden, das in unterstützt wird @RequestParam
, @PathVariable
, @RequestHeader
Und @MatrixVariable
im Frühjahr MVC
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable Optional<String> game,
HttpServletRequest request) {
if (game.isPresent()) {
//game.get()
//corresponds to path "/simple/{game}"
} else {
//corresponds to path "/simple"
}
}
Sie können jederzeit Folgendes tun:
@RequestMapping(value = "/simple", method = RequestMethod.GET)
public ModelAndView gameHandler(HttpServletRequest request) {
gameHandler2(null, request)
}
@RequestMapping(value = "/simple/{game}", method = RequestMethod.GET)
public ModelAndView gameHandler2(@PathVariable("game") String game,
HttpServletRequest request) {
@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable(value="example",required = false) final String example)
Probieren Sie diesen Ansatz aus, er hat bei mir funktioniert.