web-dev-qa-db-ja.com

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

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

@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クライアントが空のパラメーターを送信しないようにするか、文字列値を受け入れて、空でないことが判明した場合にのみ解析します。

UPDATE:springの以降のバージョンは、当初の望ましい動作を実装するようになりました。

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

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

102
Brett Ryan

@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
147
Matt

デフォルト値を設定することでプリミティブ型を保持できます。この場合、 "required = false"プロパティを追加するだけです:

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

追伸Springドキュメントのこのページは役に立つかもしれません: Annotation Type RequestParam

85
AppLend

Intの代わりにジェネリッククラスIntegerを使用してRequestParamを設定すると、問題が解決します。

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

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

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

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

バージョン3.2.2で修正されました。それ以降のバージョンでは問題は発生せず、コードは正常に機能します。

0
eis