web-dev-qa-db-ja.com

Spring MVCの@RequestParamはオプションのパラメータを処理する

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

「ログアウト」のHTTPリクエストは受け付けられません。

それぞれの要求を別々に処理するように2つのコントローラを定義した場合、Springは「すでに 'Controller' Beanメソッドは...マップされています」という例外を出して文句を言います。

149
luksmir

nameおよびpasswordリクエストパラメータにもrequired = falseを付ける必要があります。これは、logoutパラメーターのみを指定した場合、実際にはnamepasswordが必須であることを実際に想定しているためです。

nameにすでに指定されているrequired = falseのおかげでpasswordは必須のパラメーターではなかったため、logoutおよびlogoutを指定したときにのみ機能しました。

184
SudoRahul

Spring 4.1.1以降の一部として、あなたは今やJava 8 Optionaloriginal ticket )を完全にサポートしているので、あなたの例では両方の要求はあなたのrequired=falseをあなたの3パラメータログアウトの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 {...}
133
dimitrisli

ケースを処理する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 {...}
34
M. Deinum