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


#1 热门回答(138 赞)

你还需要提供required = falsefornamepasswordrequest参数。那是因为,当你只提供logout参数时,它实际上预计为namepassword,因为它们仍然是强制性的。

当你刚刚给出name和4222122874时,它工作了,因为logout不是强制性参数,这要归功于已经给出了针对logoutrequired = 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 {...}