在Spring 3.0中,我可以有一个可选的路径变量吗?

例如

@RequestMapping(value = "/json/{type}", method = RequestMethod.GET)
public @ResponseBody TestBean testAjax(
        HttpServletRequest req,
        @PathVariable String type,
        @RequestParam("track") String track) {
    return new TestBean();
}

这里我想/json/abc或/json调用相同的方法。 一个明显的解决方法是将类型声明为请求参数:

@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();
}

然后是/json?Type =abc&track=aa or /json?Track =rr将工作


当前回答

检查这个Spring 3 WebMVC -可选路径变量。它展示了一篇对AntPathMatcher进行扩展以启用可选路径变量的文章,可能会有帮助。这篇文章都要归功于塞巴斯蒂安·赫罗尔德。

其他回答

以下是直接来自baeldung参考页面的答案:- https://www.baeldung.com/spring-optional-path-variables

您还可以使用@PathVariable注释注入路径变量的Map,这一点并不广为人知。我不确定这个特性在Spring 3.0中是否可用,或者它是后来添加的,但这里有另一种解决示例的方法:

@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 在我的例子中,我使用required。

@RequestMapping(value={ "/calificacion-usuario/{idUsuario}/{annio}/{mes}", "/calificacion-usuario/{idUsuario}" }, method=RequestMethod.GET)
public List<Calificacion> getCalificacionByUsuario(@PathVariable String idUsuario
        , @PathVariable(required = false) Integer annio
        , @PathVariable(required = false) Integer mes) throws Exception {
    return repositoryCalificacion.findCalificacionByName(idUsuario, annio, mes);
}

你不能有可选的路径变量,但你可以有两个控制器方法调用相同的服务代码:

@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();
}

如果你正在使用Spring 4.1和Java 8,你可以使用Java .util. optional,它在Spring MVC -中的@RequestParam, @PathVariable, @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"
    }       
}