Как сопоставить различные значения для параметра в том же @RequestMapping в Spring MVC?
Предположим, что у меня есть:
@RequestMapping(params = "action=nuovoprodotto")
public ModelAndView nuovoProdotto(
@RequestParam(value = "page", required = false, defaultValue = "-1") int page,
@RequestParam(value = "action") String action,
@ModelAttribute Prodotto prod, HttpSession session)
throws Exception {
можно ли отобразить этот запрос как два или три значения параметра "действие"?
Я пробовал много способов, как
@RequestMapping(params = "action=nuovoprodotto, action=salvaprodotto")
или
@RequestMapping(params = "action=nuovoprodotto|salvaprodotto")
но они не сработают... Если я не могу решить, какие решения нужно написать, чтобы написать обработчик для каждой комбинации значений параметров?
Ответы
Ответ 1
Попробуйте следующее:
@RequestMapping(params = {"action=nuovoprodotto","action=salvaprodotto"})
Атрибут params
имеет тип String[]
, но аннотации позволяют вам писать String
вместо одного элемента String[]
, поэтому эти два эквивалента:
@RequestMapping(params = {"action=nuovoprodotto"})
и
@RequestMapping(params = "action=nuovoprodotto")
Ссылка:
Обновление: мое плохое, как вы можете прочитать в разделе Расширенные параметры @RequestMapping, несколько параметров объединяются с использованием и, а не, или, таким образом, он не может работать, как указано выше.
Итак, я бы сказал, что вам нужно создать метод псевдонима с почти такой же подписью:
@RequestMapping(params = "action=nuovoprodotto")
public ModelAndView nuovoProdotto(
@RequestParam(value = "page", required = false, defaultValue = "-1") int page,
@RequestParam(value = "action") String action,
@ModelAttribute Prodotto prod, HttpSession session)
throws Exception {
// some stuff here
}
@RequestMapping(params = "action=salvaprodotto")
public ModelAndView salvaProdotto(
@RequestParam(value = "page", required = false, defaultValue = "-1") int page,
@RequestParam(value = "action") String action,
@ModelAttribute Prodotto prod, HttpSession session)
throws Exception {
return nuovoProdotto(page, action, prod, session);
}
Ответ 2
Нет, что не поддерживается.
Один из способов, который может работать, - "переопределить" метод boolean checkParameters(String[] params, HttpServletRequest request)
ServletAnnotationMappingUtils
Unforunaly - это статический метод! Поэтому вам необходимо переопределить два метода, из которых он вызывается:
-
AnnotationMethodHandler.RequestMappingInfo
`boolean matches (запрос HttpServletRequest)
-
DefaultAnnotationHandlerMapping
void validateMapping(RequestMapping mapping, HttpServletRequest request)
Но не повезло: AnnotationMethodHandler.RequestMappingInfo
- внутренний класс, и он создается непосредственно в другом внутреннем классе (ServletHandlerMethodResolver
) AnnotationMethodHandler
. Но если вы переопределите это, возможно, это будет работать. (По крайней мере, вам нужно скопировать весь класс AnnotationMethodHandlerAdapter и изменить некоторую строку кода.)
Итак, вкратце: самый простой способ по-прежнему состоит в использовании двух методов обработчика.