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メソッドは...マップされています」という例外を出して文句を言います。
name
およびpassword
リクエストパラメータにもrequired = false
を付ける必要があります。これは、logout
パラメーターのみを指定した場合、実際にはname
とpassword
が必須であることを実際に想定しているためです。
name
にすでに指定されているrequired = false
のおかげでpassword
は必須のパラメーターではなかったため、logout
およびlogout
を指定したときにのみ機能しました。
Spring 4.1.1
以降の一部として、あなたは今やJava 8 Optional
( original 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 {...}
ケースを処理する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 {...}