Pergunta

É possível fazer o @PathVariable retornar nulo se a variável path não estiver na URL?Caso contrário, preciso fazer dois manipuladores.Um para /simple e outro para /simple/{game}, mas ambos fazem o mesmo, apenas se não houver nenhum jogo definido, eu escolho o primeiro de uma lista, no entanto, se houver um parâmetro de jogo definido, eu o uso.

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

E é isso que recebo ao tentar abrir a página /simple:

Causado por:java.lang.IllegalStateException:Não foi possível encontrar @PathVariable [exemplo] em @RequestMapping

Foi útil?

Solução

Não podem ser opcionais, não.Se precisar disso, você precisará de dois métodos para lidar com eles.

Isso reflete a natureza das variáveis ​​de caminho - realmente não faz sentido que elas sejam nulas.URLs estilo REST sempre precisam do caminho completo do URL.Se você tiver um componente opcional, considere torná-lo um parâmetro de solicitação (ou seja,usando @RequestParam).Isso é muito mais adequado para argumentos opcionais.

Outras dicas

Como outros já mencionaram Não, você não pode esperar que eles sejam nulos quando você mencionou explicitamente os parâmetros do caminho.No entanto, você pode fazer algo como abaixo como solução 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 você estiver usando Spring 4.1 e Java 8, poderá usar java.util.Optional, que é suportado em @RequestParam, @PathVariable, @RequestHeader e @MatrixVariable no Spring 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"
    }           
}

Você sempre pode fazer isso:

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

Tente esta abordagem, funcionou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top