2012-09-06 41 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