Как мне сопоставить разные значения параметра в одном и том же @RequestMapping в Spring MVC? - PullRequest
14 голосов
/ 02 февраля 2011

Предположим, у меня есть:

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

возможно ли отобразить этот запрос как два или три значения параметра "action"?

Я пробовал много способов, как

@RequestMapping(params = "action=nuovoprodotto, action=salvaprodotto")  

или

@RequestMapping(params = "action=nuovoprodotto|salvaprodotto")  

но они не работают ... Если я не могу, каковы решения, кроме написания обработчика для каждой комбинации значений параметров?

Ответы [ 2 ]

20 голосов
/ 02 февраля 2011

Попробуйте это:

@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);
}
3 голосов
/ 02 февраля 2011

Нет, это не поддерживается.

Один из возможных способов работы - это "переопределение" метода boolean checkParameters(String[] params, HttpServletRequest request) из ServletAnnotationMappingUtils

Неправильно это статический метод!Поэтому вам необходимо переопределить два метода, из которых он вызывается:

  • AnnotationMethodHandler.RequestMappingInfo `логические совпадения (запрос HttpServletRequest)
  • DefaultAnnotationHandlerMapping void validateMapping(RequestMapping mapping, HttpServletRequest request)

Но опять не повезло: AnnotationMethodHandler.RequestMappingInfo - это внутренний класс, и он создается непосредственно в другом внутреннем классе (ServletHandlerMethodResolver) из AnnotationMethodHandler.Но если вы переопределите это тоже, возможно, это сработает.( По крайней мере, вам нужно скопировать весь класс AnnotationMethodHandlerAdapter и изменить некоторую строку кода. )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...