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

时间:2014-03-13 09:05:34

标签: java spring spring-mvc

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方法...映射"。

3 个答案:

答案 0 :(得分:187)

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

当您刚刚提供namepassword时,它很有效,因为logout已经为required = false提供了logout,因此{{1}}不是必填参数。

答案 1 :(得分:134)

作为Spring 4.1.1以后的一部分,您现在完全支持Java 8 Optionaloriginal 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 {...}