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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top