如果找不到 null,@PathVariable可以返回 null 吗?

如果路径变量不在 url 中,是否可以使 返回 null?否则,我需要制作两个处理程序。一个用于,另一个用于,但两者都做同样的事情,只是如果没有定义游戏,我从列表中选择第一个,但是如果有一个游戏参数定义,那么我使用它。@PathVariable/simple/simple/{game}

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

这就是我在尝试打开页面时得到的:/simple

由以下原因引起:java.lang.IllegalStateException:在@RequestMapping中找不到@PathVariable [示例]


答案 1

它们不能是可选的,不。如果需要,则需要两种方法来处理它们。

这反映了路径变量的本质 - 它们为空实际上没有意义。REST 样式的 URL 始终需要完整的 URL 路径。如果您有一个可选组件,请考虑将其设置为请求参数(即使用 )。这更适合于可选参数。@RequestParam


答案 2

正如其他人已经提到过的“否”,当您显式提及路径参数时,您不能期望它们为 null。但是,您可以执行如下操作作为解决方法 -

@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"
    }           
}

如果您使用的是Spring 4.1和Java 8,则可以使用java.util.Optional,它在,和Spring MVC中受支持。@RequestParam@PathVariable@RequestHeader@MatrixVariable

@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"
    }           
}

推荐