2011-03-30 25 views
18

¿Es posible hacer que el @PathVariable a devolver NULL si la variable de ruta no está en la url? De lo contrario, necesito hacer dos manejadores. Uno de /simple y otro para /simple/{game}, pero ambos hacen lo mismo solo si no hay un juego definido ESCOJO primero de una lista sin embargo, si hay un parámetro de juego definido a continuación, lo uso.¿Puede @PathVariable devolver nulo si no se encuentra?

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

Y esto es lo que me pasa cuando se trata de la página /simple abrir:

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

Respuesta

21

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

Esto refleja la naturaleza de las variables de ruta - que no tiene mucho sentido para ellos ser nulo. Las URL de estilo REST siempre necesitan la ruta completa de URL. 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.

+0

Gracias por esto! :) Verificará '@ RequestParam'. – Rihards

+0

Sin embargo, la primavera v4.3.3 sine apoya '@PathVariable (valor = "SiteID", requerido = false) Cadena siteId' aunque no he encontrado la forma * no es proporcionar una variable de ruta * o dejarlo en blanco o vacío. – Alex

17

siempre se puede simplemente 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) { 
17

Como otros ya han mencionado No, no puedes esperar que sean nulas cuando haya mencionado explícitamente los parámetros de ruta. Sin embargo se puede hacer algo, como a continuación como una solución -

@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 Primavera 4.1 y Java 8 se puede utilizar java.util.Optional que se apoya en @RequestParam, @PathVariable, @RequestHeader y @MatrixVariable en 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" 
    }   
} 
+4

Gracias, esta debería ser la respuesta aceptada – membersound

+0

Gracias y esta es una solución mejor. – drafterr

Cuestiones relacionadas