¿Con Spring puedo crear una variable de ruta opcional?

Resuelto Shamik asked hace 13 años • 10 respuestas

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/abcllamar /jsonal mismo método.
Una solución obvia es declararla typecomo 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=aao /json?track=rrfuncionará

Shamik avatar Feb 05 '11 06:02 Shamik
Aceptado

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();
}
earldouglas avatar Feb 05 '2011 00:02 earldouglas

Si está utilizando Spring 4.1 y Java 8 , puede utilizar java.util.Optionalel que es compatible con @RequestParam, @PathVariabley 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"
    }       
}
Aniket Thakur avatar Jan 08 '2016 06:01 Aniket Thakur

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();
    }
}
Paul Wardrip avatar Mar 13 '2015 17:03 Paul Wardrip