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


186

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メソッドが存在します...マップされています」という例外を報告します。


2
:この記事読んcodeflex.co/...
ybonda

回答:


224

required = falsefor パラメータnamepasswordrequestパラメータも指定する必要があります。それのあなただけを提供する場合、理由logoutパラメータを、それが実際のために期待するnamepasswordだけでなく、彼らはまだ必須です。

あなただけ与えたとき、それは働いていたnameし、passwordためにlogoutするために必須パラメータのおかげではなかったrequired = false、すでに与えられたためlogout


168

Spring 4.1.1以降の一環として、Java 8 Optional元のチケット)が完全にサポートされるようになったため、この例で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
@VibhavChaddha次のようなものを使用できます:if(idOfUser.isPresent()){System.out.println( "idOfUser:" + idOfUser.get()); }
Cassio Seffrin

10
Intellij警告:パラメータ 'requestedTimelineStart'の型として使用される 'Optional <Long>' less ...(Strg + F1)検査情報:java.util.Optional <T>、java.util.OptionalDouble、javaの使用を報告します。フィールドまたはパラメーターのタイプとして、util.OptionalInt、java.util.OptionalLong、またはcom.google.common.base.Optional。オプションは、「結果なし」を表す明確な方法が必要なライブラリメソッドの戻り値の型に制限されたメカニズムを提供するように設計されました。java.util.Optional型ではないクラスをSerializableにする必要がある場合も、java.util.Optional型のフィールドを使用すると問題が発生します。
PeMa 2018年

これは、Java 8での新しい正解になるはずです。
java-addict301

40

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

1
誰かがログアウト、名前、パスワードの両方をURLに渡すとどうなりますか?ドキュメンテーションを読むだけで、!myParam style expressions indicate that the * specified parameter is not supposed to be present in the request.試してみると書かれています。
リングベアラー

2
最適な一致が見つかるでしょう。おそらくhandleLoginelse を使用しようとしますが、マッピングが見つからないことを示す例外が発生します。
M. Deinum 2016

3
ただ1つのメモ:セキュリティの観点から、ログアウトはPOSTリクエストのみを受け入れる必要があるため、2つのメソッドがあり、URLを同じに保つことは意味がありません。
RuによるFlasH 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.