java - requestparam - ¿Puede @PathVariable devolver nulo si no se encuentra?
requestmapping params (4)
Como otros ya han mencionado No, no puede esperar que sean nulos cuando ha mencionado explícitamente los parámetros de ruta. Sin embargo, puedes hacer algo como a continuación 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 se admite 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"
}
}
¿Es posible hacer que @PathVariable
devuelva nulo si la variable de ruta no está en la url? De lo contrario necesito hacer dos manejadores. Uno para /simple
y otro para /simple/{game}
, pero ambos hacen lo mismo solo 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 al intentar abrir la página /simple
:
Causado por: java.lang.IllegalStateException: No se pudo encontrar @PathVariable [ejemplo] en @RequestMapping
No pueden ser opcionales, no. Si necesitas eso, necesitas 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 completa de la URL. Si tiene un componente opcional, considere convertirlo en un parámetro de solicitud (es decir, use @RequestParam
). Esto se adapta mucho mejor a los argumentos opcionales.
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)
Prueba este enfoque, funcionó para mí.