是否有可能使用defaultValue的空RequestParam值?


120

如果我有一个类似于以下内容的请求映射:

@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客户端发送空参数或接受字符串值并仅在未发现空白的情况下进行解析来解决此问题。

更新:春季的更高版本现在实现了最初想要的行为。

我刚刚在春季4.3.5中对此进行了测试,发现该行为实际上实际上会将null值转换为默认值而不会引发NumberFormatException,因此;我原来的映射现在可以正常工作了。

我不确定此行为更改是在Spring的哪个版本上进行的。


确定参数将是引发该异常的Integer类型?
laher 2012年

3
即时消息不是spring expert,但未设置时使用默认值吗?即,如果您的请求是example.com/test?当您使用example.com/test?i=时,我就存在并设置为“”,因此不使用默认值
user902383 2012年

谢谢amir75,偶然提供的String类型。user902383,这是正确的,尽管对于整数值,我更希望null / empty值使用defaultValue代替。
Brett Ryan

Answers:


175

您可以将@RequestParam类型更改为Integer并使它不是必需的。这将使您的请求成功,但是它将为null。您可以在controller方法中将其显式设置为默认值:

@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

6
对此进行更新,Spring的最新版本实际上不再需要null检查,因为spring包含了所需的行为,即空值将导致使用默认值。
Brett Ryan

3
作废答案,最好的解决方案是来自@AppLend
Jose Pose S

101

您可以通过设置默认值来保持基本类型,在这种情况下,只需添加“ required = false”属性即可:

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

PS Spring文档中的此页面可能有用: 注释类型RequestParam


1
谢谢,但您错过了标题中我的问题。我已经要求提供空参数的功能,/test?i=并且由于i为空具有默认值。
Brett Ryan

5
无论如何,暗中defaultValue提供了时间required == false
Timur Milovanov 2016年

4
如果提供了参数但为空defaultValue则无效。
Brett Ryan


1

您也可以这样做-

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

3
如果您具有defaultValue,则无需将其设为Optional。
凯文M

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.