如何在Spring MVC中的相同@RequestMapping中映射参数的不同值?

时间:2011-02-02 16:49:30

标签: java spring 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 {

是否可以将此请求映射为“action”参数的两个或三个值?

我尝试了很多方法,比如

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

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

但它们不起作用......如果我不能解决什么问题,那么除了为每个参数值组合编写处理程序之外?

2 个答案:

答案 0 :(得分:20)

试试这个:

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

params属性实际上属于String[]类型,但注释允许您编写String代替单个元素String[],因此这两个属性是等效的:

@RequestMapping(params = {"action=nuovoprodotto"})

@RequestMapping(params = "action=nuovoprodotto")

参考:


更新:我的不好,正如您在Advanced @RequestMapping options部分中所读到的那样,多个参数组合使用的是,而不是或者,因此它不能像上面指定的那样工作。

所以我要说你要做的是创建一个几乎相同签名的别名方法:

@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);
}

答案 1 :(得分:3)

不支持。

可行的一种方法是“覆盖”boolean checkParameters(String[] params, HttpServletRequest request)的方法ServletAnnotationMappingUtils

Unforunaly它是一个静态方法!所以你需要覆盖调用它的两个方法:

  • AnnotationMethodHandler.RequestMappingInfo`boolean matches(HttpServletRequest request)
  • DefaultAnnotationHandlerMapping void validateMapping(RequestMapping mapping, HttpServletRequest request)

但是再次没有运气:AnnotationMethodHandler.RequestMappingInfo是一个内部类,它直接在ServletHandlerMethodResolver的另一个内部类(AnnotationMethodHandler)中创建。但是,如果你也覆盖它,它可以工作。 (至少你必须复制整个AnnotationMethodHandlerAdapter类并更改一些代码行。

总而言之:最简单的方法仍然是有两种处理程序方法。