Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Как уже упоминалось выше, вы не можете ожидать, что они будут пустыми, если вы явно указали параметры пути. Однако в качестве обходного пути вы можете сделать что-то вроде ниже -

@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, который поддерживается в @RequestParam, @PathVariable, @RequestHeader и @MatrixVariable в Spring 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"
    }           
}