2014-03-13 88 views
85

Spring控制器可以处理这两种请求吗?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方法...映射”的异常。

回答

107

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

它工作时,你只给namepassword因为logout没有一个强制性的参数感谢required = falselogout已经给。

30

创建2个处理案例的方法。您可以指示@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 {...} 
+0

当有人将注销,名称和密码都传递给URL时会发生什么?只要阅读文档,它说'!myParam样式表达式表明指定的参数不应该出现在请求中。“必须尝试。 –

+1

它会找到最好的匹配,它可能会尝试使用'handleLogin',否则它会提供一个异常,说明不能找到映射。 –

+0

只需要注意一点:从安全角度来看,注销应该只接受POST请求,所以_should_有2种方法,并且保持URL不变是毫无意义的。 –

54

作为Spring 4.1.1部分起你现在能完全支持Java 8 Optionaloriginal ticket),因此在你的榜样两个请求将通过您的单一映射端点去,只要你替换required=false与可选为您3个PARAMS注销,名称,密码:

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

太棒了。谢谢。 https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html – OhadR

+0

嗨,@dimitrisli。我正在使用'@PathVariable(“idOfUser”)可选 idOfUser'。现在我需要获取/打印** idOfuser **的值。你能不能帮助我,因为现在打印后我得到**可选[1234] **,但我真正想要的只是** 1234 **。 – Learner

+0

嘿,@dimitrisli。自己想出来。不管怎么说,多谢拉。 :) – Learner