空のRequestParam値にdefaultValueを使用させることは可能ですか?


120

次のようなリクエストマッピングがある場合:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

そして、このリクエストを次のように呼び出します:

http://example.com/test?i=

エラーメッセージが表示される

タイプ「java.lang.String」の値をタイプ「int」に変換できませんでした。ネストされた例外はjava.lang.NumberFormatException:入力文字列の場合: "" '

これを解決するには、JavaScriptクライアントが空のパラメータを送信しないようにするか、文字列値を受け入れ、それらが空白でないことが判明した場合にのみ解析します。

更新:春のそれ以降のバージョンでは、本来望ましい動作が実装されています。

私はこれを春の4.3.5でテストしたところ、動作が実際にはnull値をデフォルト値に変換することがわかりましたNumberFormatException。私の元のマッピングは正常に動作します。

この動作の変更が行われた春のバージョンはわかりません。


確かにパラメータはその例外を発生させる整数型でしょうか?
laher

3
私は春のエキスパートではありませんが、設定しない場合はデフォルト値が使用されますか?つまり、リクエストがexample.com/testの場合はexample.com/test?i=を使用すると、iが存在し、 ""に設定されるため、デフォルト値は使用されません
user902383

誤って供給されたStringタイプのamir75に感謝します。user902383、それは正しいですが、整数値の場合、null /空の値には代わりにdefaultValueを使用することをお勧めします。
ブレットライアン

回答:


175

@RequestParamタイプをIntegerに変更して、不要にすることができます。これによりリクエストは成功しますが、その後はnullになります。コントローラーメソッドで明示的にデフォルト値に設定できます。

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

上記の例からdefaultValueを削除しましたが、まったく設定されていないリクエストを受け取ることが予想される場合は、それを含めることができます。

http://example.com/test

6
これを更新しただけで、Springの最近のバージョンでは実際にnullチェックは不要になりました。これは、空に値を指定するとデフォルト値が使用されるという目的の動作がSpringに含まれているためです。
ブレット・ライアン

3
時代遅れの答え、@ AppLendからの最良の解決策
S

101

デフォルト値を設定することでプリミティブタイプを維持できます。この場合は、「required = false」プロパティを追加するだけです

@RequestParam(value = "i", required = false, defaultValue = "10") int i

PS Springドキュメントのこのページは役に立つかもしれません: 注釈タイプRequestParam


1
ありがとうございますが、タイトルにある私の質問の要点を逃しました。私は、空のparamsを供給する能力を求めてきました/test?i=し、以来、i空で、デフォルト値を持っています。
ブレット・ライアン

5
とにかく、defaultValue提供されたときは、required == false暗黙的に
ティムールミロヴァノフ

4
paramが指定されているが空の場合、defaultValue効果はありません。
ブレット・ライアン

12

Intの代わりに汎用クラスIntegerを使用してRequestParamを設定できます。これにより問題が解決します。

   @RequestParam(value= "i", defaultValue = "20") Integer i

1

次のようなこともできます-

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i

3
defaultValueがある場合、これをオプションにする必要はありません。
Kevin M

1

これは2013年のバグと見なされていました:https : //jira.spring.io/browse/SPR-10180

バージョン3.2.2で修正されました。その後のバージョンでは問題は発生しないはずであり、コードは問題なく動作するはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.