在Spring控制器中,能否有一个基于请求参数数量的方法?
问题内容:
我一直在用Spring改造现有的Webapp。显然,从Spring开始比在以后添加要容易。
我们有可以接受多个请求参数的servlet。根据参数的数量,将采取不同的措施。例如,
/doSomething?prod=15
显示产品15的信息,并
/doSomething?prod=15&owner=99
将产品15的所有者设置为99,然后
/doSomething?prod=15&delete=y
删除产品15。
我有一个正在工作的控制器,但是我不知道如何根据参数数量调用不同的方法。例如,这可行(一种简单的方法只是为了确保我掌握了基础知识):
@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
ModelAndView mav = new ModelAndView();
mav.setViewName("jsonView");
return mav;
}
但不是这个:
@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
ModelAndView mav = new ModelAndView();
mav.setViewName("jsonView");
return mav;
}
@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod,
@RequestParam("owner") int owner,
Model model)
{
ModelAndView mav = new ModelAndView();
mav.setViewName("jsonView");
return mav;
}
这将引发IllegalStateException,“为HTTP路径’/ mytest’映射的歧义处理程序方法”,然后继续说明:
如果打算使用多种方法处理同一路径,则将它们分解为专用的处理程序类,并在类型级别映射该路径!
我不明白该信息告诉我要做什么。
如果我将方法设置为接受比传入的参数更多或不同的参数,则会得到“客户端发送的请求在语法上不正确()”。
保罗
问题答案:
RequestMapping注释告诉Spring哪些URL请求映射到您的控制器。您可以将值放在方法级别或类级别。
在您的示例中,两个请求映射之间没有什么不同。您可以执行以下操作:
@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod", "owner"})
public String doIt( @RequestParam("prod") int prod,
@RequestParam("owner") int owner) {
LOGGER.trace("in doIt(int,int)");
return "foo/bar";
}
@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod"})
public String doIt( @RequestParam("prod") int prod) {
LOGGER.trace("in doIt(int)");
return "foo/bar";
}
如果需要,您甚至可以在他们之间共享模型:
@Model
public static Map<String,Object> model() {
LOGGER.trace("in model()");
Map<String,Object> model = new HashMap<>();
model.put("hello", "hello world");
return model;
}