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。
您还需要为name
和password
请求参数提供required = false
。 这是因为,当你只提供logout
参数时,它实际上期望name
和password
以及它们仍然是强制性的。
当你只给了name
和password
时,它就起作用了,因为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 {...}