Как сопоставить различные значения для параметра в том же @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 и изменить некоторую строку кода.)

Итак, вкратце: самый простой способ по-прежнему состоит в использовании двух методов обработчика.