假设我有:
@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")
但它们不起作用......如果我不能解决什么问题,那么除了为每个参数值组合编写处理程序之外?
答案 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类并更改一些代码行。)
总而言之:最简单的方法仍然是有两种处理程序方法。