Domanda

E' possibile realizzare il @PathVariable restituire null se la variabile del percorso non è nell'URL?Altrimenti devo creare due gestori.Uno per /simple e un altro per /simple/{game}, ma entrambi fanno lo stesso solo se non è definito alcun gioco, ne scelgo il primo da un elenco, tuttavia se è definito un parametro di gioco, lo uso.

@RequestMapping(value = {"/simple", "/simple/{game}"}, method = RequestMethod.GET)
public ModelAndView gameHandler(@PathVariable("example") String example,
            HttpServletRequest request) {

E questo è ciò che ottengo quando provo ad aprire page /simple:

Causato da:java.lang.IllegalStateException:Impossibile trovare @PathVariable [esempio] in @RequestMapping

È stato utile?

Soluzione

Non possono essere facoltativi, no.Se ne hai bisogno, hai bisogno di due metodi per gestirli.

Ciò riflette la natura delle variabili di percorso: non ha senso che siano nulle.Gli URL in stile REST richiedono sempre il percorso URL completo.Se disponi di un componente opzionale, considera invece di renderlo un parametro di richiesta (ad es.utilizzando @RequestParam).Questo è molto più adatto agli argomenti opzionali.

Altri suggerimenti

Come altri hanno già menzionato No, non puoi aspettarti che siano nulli quando hai menzionato esplicitamente i parametri del percorso.Tuttavia puoi fare qualcosa come di seguito come soluzione alternativa:

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

Se utilizzi Spring 4.1 e Java 8 puoi utilizzare java.util.Optional che è supportato in @RequestParam, @PathVariable, @RequestHeader E @MatrixVariable in primavera 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"
    }           
}

Potresti sempre fare semplicemente questo:

@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)

Prova questo approccio, ha funzionato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top