144

次のようなリクエスト マッピングがあるとします。

@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: For input string: ""' です

これを解決するには、javascript クライアントが空のパラメーターを送信するのを停止するか、文字列値を受け入れて、空白ではない場合にのみ解析します。

更新: Spring の以降のバージョンでは、当初の目的の動作が実装されるようになりました。

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

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

4

6 に答える 6

205

@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
于 2012-09-22T00:18:44.957 に答える
117

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

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

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

于 2014-02-20T08:40:02.803 に答える
2

@Nullableデフォルト値で使用できます。

@Nullable @RequestParam(value = "i", defaultValue = "10") Integer i
于 2021-08-25T11:16:56.007 に答える