Spring控制器是否可以处理这两种请求?
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 {...}
使用" logout"的HTTP请求不被接受。
如果我定义了两个控制器来分别处理每个请求,那么Spring会抱怨异常"已经有' Controller' bean方法...映射"。
答案 0 :(得分:187)
您还需要为required = false
和name
请求参数提供password
。这是因为,当您仅提供logout
参数时,它实际上需要name
和password
以及它们仍然是强制性的。
当您刚刚提供name
和password
时,它很有效,因为logout
已经为required = false
提供了logout
,因此{{1}}不是必填参数。
答案 1 :(得分:134)
作为Spring 4.1.1
以后的一部分,您现在完全支持Java 8 Optional
(original ticket),因此在您的示例中,只要您更换,这两个请求都将通过您的单个映射端点进行required=false
with optional for 3 params logout,name,password:
@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 {...}
答案 2 :(得分:34)
创建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 {...}