如何在Spring MVC中的相同@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 { 

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

我试过很多方法

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

要么

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

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

尝试这个:

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

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

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

 @RequestMapping(params = "action=nuovoprodotto") 

参考:

  • @RequestMapping.params()

更新:我的不好,正如你可以在高级@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); } 

不,不支持。

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

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

  • AnnotationMethodHandler.RequestMappingInfo布尔匹配(HttpServletRequest请求)
  • DefaultAnnotationHandlerMapping void validateMapping(RequestMapping mapping, HttpServletRequest request)

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

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