Может @PathVariable возвращать null если он не найден?

можно сделать @PathVariable чтобы вернуть null, если переменная path не находится в url-адресе? В противном случае мне нужно сделать двух обработчиков. Для /simple и еще один для /simple/{game}, но оба делают то же самое, только если нет определенной игры, я выбираю первый из списка, однако, если есть игровой параметр, то я его использую.

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

и вот что я получаю при попытке открыть страницу /simple:

вызвано: java.ленг.IllegalStateException: не удалось найти @PathVariable [пример] в @RequestMapping

4 ответов


они не могут быть факультативными, нет. Если вам это нужно, вам нужны два метода, чтобы справиться с ними.

это отражает природу переменных пути - на самом деле не имеет смысла, чтобы они были нулевыми. URL-адреса в стиле REST всегда нуждаются в полном url-пути. Если у вас есть дополнительный компонент, подумайте о том, чтобы сделать его параметром запроса (т. е. использовать @RequestParam). Это гораздо лучше подходит для необязательных аргументов.


поскольку другие уже упоминали нет, вы не можете ожидать, что они будут 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.утиль.Необязательно, который поддерживается в @RequestParam, @PathVariable, @RequestHeader и @MatrixVariable весной 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"
    }           
}

вы всегда можете просто сделать это:

@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)

попробуйте этот подход, он работал для меня.