¿Con Spring puedo crear una variable de ruta opcional?
Con Spring 3.0, ¿puedo tener una variable de ruta opcional?
Por ejemplo
@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
HttpServletRequest req,
@PathVariable String type,
@RequestParam("track") String track) {
return new TestBean();
}
Aquí me gustaría /json/abc
llamar /json
al mismo método.
Una solución obvia es declararla type
como parámetro de solicitud:
@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
HttpServletRequest req,
@RequestParam(value = "type", required = false) String type,
@RequestParam("track") String track) {
return new TestBean();
}
y luego /json?type=abc&track=aa
o /json?track=rr
funcionará
No puede tener variables de ruta opcionales, pero puede tener dos métodos de controlador que llamen al mismo código de servicio:
@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
HttpServletRequest req,
@PathVariable String type,
@RequestParam("track") String track) {
return getTestBean(type);
}
@RequestMapping(value = "/json", method = RequestMethod.GET)
public @ResponseBody TestBean testBean(
HttpServletRequest req,
@RequestParam("track") String track) {
return getTestBean();
}
Si está utilizando Spring 4.1 y Java 8 , puede utilizar java.util.Optional
el que es compatible con @RequestParam
, @PathVariable
y Spring MVC.@RequestHeader
@MatrixVariable
@RequestMapping(value = {"/json/{type}", "/json" }, method = RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
@PathVariable Optional<String> type,
@RequestParam("track") String track) {
if (type.isPresent()) {
//type.get() will return type value
//corresponds to path "/json/{type}"
} else {
//corresponds to path "/json"
}
}
No es muy conocido que también puedes inyectar un mapa de las variables de ruta usando la anotación @PathVariable. No estoy seguro de si esta característica está disponible en Spring 3.0 o si se agregó más tarde, pero aquí hay otra forma de resolver el ejemplo:
@RequestMapping(value={ "/json/{type}", "/json" }, method=RequestMethod.GET)
public @ResponseBody TestBean typedTestBean(
@PathVariable Map<String, String> pathVariables,
@RequestParam("track") String track) {
if (pathVariables.containsKey("type")) {
return new TestBean(pathVariables.get("type"));
} else {
return new TestBean();
}
}