Pregunta

¿Es posible hacer el @PathVariable ¿Devolver nulo si la variable de ruta no está en la URL?De lo contrario, necesito crear dos controladores.Uno para /simple y otro para /simple/{game}, pero ambos hacen lo mismo solo que si no hay un juego definido, elijo el primero de una lista; sin embargo, si hay un parámetro de juego definido, lo uso.

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

Y esto es lo que obtengo cuando intento abrir la página. /simple:

Causado por:java.lang.IllegalStateException:No se pudo encontrar @PathVariable [ejemplo] en @RequestMapping

¿Fue útil?

Solución

No pueden ser opcionales, no.Si necesita eso, necesita dos métodos para manejarlos.

Esto refleja la naturaleza de las variables de ruta: realmente no tiene sentido que sean nulas.Las URL de estilo REST siempre necesitan la ruta URL completa.Si tiene un componente opcional, considere convertirlo en un parámetro de solicitud (es decir,usando @RequestParam).Esto se adapta mucho mejor a los argumentos opcionales.

Otros consejos

Como otros ya han mencionado No, no puede esperar que sean nulos cuando haya mencionado explícitamente los parámetros de la ruta.Sin embargo, puedes hacer algo como lo siguiente como solución 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"
    }           
}

Si está utilizando Spring 4.1 y Java 8, puede usar java.util.Optional, que es compatible con @RequestParam, @PathVariable, @RequestHeader y @MatrixVariable en 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"
    }           
}

Siempre puedes hacer esto:

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

Pruebe este enfoque, funcionó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top