1. ホーム
  2. java

[解決済み] 空のRequestParamの値にdefaultValueを使用させることは可能ですか?

2022-06-23 13:53:12

質問

以下のようなリクエストマッピングがあった場合、どのように対応すればよいでしょうか?

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

アップデイト : Springの後のバージョンでは、当初望まれた動作が実装されるようになりました。

spring 4.3.5でテストしてみたところ、この挙動は実際にNULL値をデフォルト値に変換し NumberFormatException を発生させることなく、NULL 値をデフォルト値に変換することがわかりました。

この動作の変更は、spring のどのバージョンで行われたのかはわかりません。

どのように解決するのですか?

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