Может ли @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
Ответы
Ответ 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"
}
}