次のようなリクエストマッピングがある場合:
@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値をデフォルト値に変えることがわかりました。元のマッピングが正常に機能するようになりました。
この行動の変更が行われた春のバージョンはわかりません。
@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
デフォルト値を設定することでプリミティブ型を保持できます。この場合、 "required = false"プロパティを追加するだけです:
@RequestParam(value = "i", required = false, defaultValue = "10") int i
追伸Springドキュメントのこのページは役に立つかもしれません: Annotation Type RequestParam
Intの代わりにジェネリッククラスIntegerを使用してRequestParamを設定すると、問題が解決します。
@RequestParam(value= "i", defaultValue = "20") Integer i
このようなこともできます-
@RequestParam(value= "i", defaultValue = "20") Optional<Integer> i
これは2013年にバグと見なされていました: https://jira.spring.io/browse/SPR-1018
バージョン3.2.2で修正されました。それ以降のバージョンでは問題は発生せず、コードは正常に機能します。