@PathVariable pode retornar nulo se não for encontrado?
-
14-11-2019 - |
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
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.