问题
弹簧控制器是否可以处理这两种请求?
1) http://localhost:8080/submit/id/ID123432?logout=true
2) http://localhost:8080/submit/id/ID123432?name=sam&password=543432
如果我定义了这种类型的单个控制器:
@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,
produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
@RequestParam(value = "logout", required = false) String logout,
@RequestParam("name") String username,
@RequestParam("password") String password,
@ModelAttribute("submitModel") SubmitModel model,
BindingResult errors) throws LoginException {...}
不接受带有"注销"的HTTP请求。
如果我定义了两个控制器来分别处理每个请求,那么Spring会抱怨"已经存在'Controller'bean方法...已映射"。
#1 热门回答(138 赞)
你还需要提供required = false
forname
和password
request参数。那是因为,当你只提供logout
参数时,它实际上预计为name
和password
,因为它们仍然是强制性的。
当你刚刚给出name
和4222122874时,它工作了,因为logout
不是强制性参数,这要归功于已经给出了针对logout
的required = false
。
#2 热门回答(91 赞)
作为Spring 4.1.1
的一部分,你现在完全支持Java 8Optional
(original ticket),因此在你的示例中,只要你将3个params注销,名称,密码替换为required=false
和Optional,两个请求都将通过你的单个映射端点:
@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET,
produces="text/xml")
public String showLoginWindow(@PathVariable("id") String id,
@RequestParam(value = "logout") Optional<String> logout,
@RequestParam("name") Optional<String> username,
@RequestParam("password") Optional<String> password,
@ModelAttribute("submitModel") SubmitModel model,
BindingResult errors) throws LoginException {...}
#3 热门回答(32 赞)
创建2个处理案例的方法。你可以指示@RequestMapping
注释在映射请求时考虑某些参数。这样你就可以很好地将它分成2种方法。
@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET,
produces="text/xml", params={"logout"})
public String handleLogout(@PathVariable("id") String id,
@RequestParam("logout") String logout) { ... }
@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET,
produces="text/xml", params={"name", "password"})
public String handleLogin(@PathVariable("id") String id, @RequestParam("name")
String username, @RequestParam("password") String password,
@ModelAttribute("submitModel") SubmitModel model, BindingResult errors)
throws LoginException {...}