2012-09-06 14 views
65

私は、次のようなAA要求マッピングしている場合:空のRequestParam値にdefaultValueを使用することはできますか?

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

は私が

はの値を変換に失敗しましたエラーメッセージが表示されます。その後、

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

をそして、この要求に呼び出しを'int'を入力するには 'java.lang.String'と入力します。ネストされた例外はjava.lang.NumberFormatExceptionです:入力文字列の場合:「」」

私は空のパラメータを送信してからJavaScriptクライアントを停止することのいずれかによって、または文字列値を受け入れ、彼らだけが見つからない場合は解析することによってこの問題を解決することができます空白にする。

UPDATE:それ以降のバージョンのスプリングでは、元の動作が実装されるようになりました。

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

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

+0

この例外を発生させるには、パラメータがInteger型である必要がありますか? – laher

+3

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

+0

ありがとうございましたamir75、誤って 'String'型を提供しました。 user902383、それは正しいですが、整数値の場合、null /空の値はdefaultValueを代わりに使用することをお勧めします。 –

答えて

101

@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 
+3

このアップデートでは、最近のバージョンのバネは実際には空の値が使用されるデフォルトの値になるというバネに目的の動作が含まれているので、実際にはnullチェックを必要としません。 –

+1

廃止された回答、最高の解決策は@AppLendです –

57

あなただけを追加する場合には、デフォルト値を設定することにより、プリミティブ型を保つことができる "必要= false" をプロパティ:

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

P.S. 春のドキュメントからこのページには便利かもしれません:あなたはまた、このような何かを行うことができます Annotation Type RequestParam

+0

ありがとうございますが、タイトルにある私の質問のポイントを逃しました。私は空のパラメータ '/ test?i ='を与える能力を求めてきました。そして 'i'が空であるのでデフォルト値を持っています。 –

+1

とにかく、 '' 'defaultValue'''が提供されたとき、' '' required == false'''が暗黙的に –

+3

paramが提供されていても空であれば、 'defaultValue'は有効になりません。 –

0

-

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

あなたはintの代わりに汎用クラス整数を使用して、RequestParamを設定することができ、それはあなたの問題を解決します。

@RequestParam(value= "i", defaultValue = "20") Integer i 
関連する問題