2012-09-06 69 views
65

如果我有類似下面的AA請求映射:是否有可能有空的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,因此;我的原始映射現在工作正常。

我不確定這個行爲改變的春天是哪個版本。

+0

當然,參數是一個Integer類型來引發異常? – laher

+3

即時通訊不是spring專家,但是當你沒有設置它時,默認值是否被使用?即如果您的請求將是http://example.com/test?當你使用http://example.com/test?i=然後我出席並設置爲「」,所以默認值不使用 – user902383

+0

謝謝amir75,意外提供'字符串'類型。 user902383,這是正確的,但對於整數值,我寧願空/空值將使用defaultValue來代替。 –

回答

101

您可以將@RequestParam類型更改爲Integer並使其不是必需的。這可以讓你的請求成功,但它會是空的。你可以明確地將它設置爲默認值在控制器方法:

@RequestMapping(value = "/test", method = RequestMethod.POST) 
@ResponseBody 
public void test(@RequestParam(value = "i", required=false) Integer i) { 
    if(i == null) { 
     i = 10; 
    } 
    // ... 
} 

我從上面的例子中刪除的默認值,但您可能要包括,如果你希望收到的地方沒有設置請求在所有:

http://example.com/test 
+3

只需要對此進行更新,最新版本的spring實際上不再需要null檢查,因爲spring中已包含所需的行爲,即空值將導致使用默認值。 –

+1

已過時的答案,最佳解決方案來自@AppLend –

57

你可以通過設置默認值,在你的情況下,只需添加保持原始類型「所需=假」屬性:

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

P.S. 這從Spring文檔頁面可能是有用的: Annotation Type RequestParam

+0

謝謝,但您錯過了題目中的問題。我要求提供空params的能力'/ test?i =',因爲'i'爲空有默認值。 –

+1

無論如何,當提供'''defaultValue'''時,'''required == false'''暗示 –

+3

如果參數被提供但是爲空,'defaultValue'不會生效。 –

0

你也可以做這樣的事情 -

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

您可以設置RequestParam,使用通用Integer類的不是int,這將解決您的問題。

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