Spring MVC中的@RequestParam处理可选参数

弹簧控制器可以处理这两种请求吗?

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方法…映射”的exception。

您还需要为namepassword请求参数提供required = false 。 这是因为,当你只提供logout参数时,它实际上期望namepassword以及它们仍然是强制性的。

当你只给了namepassword时,它就起作用了,因为logout并不是一个必须的参数,这要归功于required = false

作为Spring 4.1.1以后的一部分,现在你可以完全支持Java 8 Optional ( 原始票证 ),因此在你的示例中,只要你用3个参数注销replacerequired=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 {...} 

创build两个方法来处理这些情况。 您可以指示@RequestMapping注释在映射请求时考虑某些参数。 这样,你可以很好地将其分成两种方法。

 @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 {...}