是否可以使用defaultValue空RequestParam值?

Bre*_*yan 112 java spring spring-mvc

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

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

然后使用以下命令调用此请求:

http://example.com/test?i=
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

无法将类型'java.lang.String'的值转换为'int'类型; 嵌套异常是java.lang.NumberFormatException:对于输入字符串:""'

我可以通过阻止javascript客户端发送空参数,或者接受字符串值并仅解析它们是否为空白来解决这个问题.

更新:更高版本的spring现在实现了最初所需的行为.

我刚刚在4.3.5春季对此进行了测试,并且发现该行为现在实际上将空值转换为默认值而不提高a NumberFormatException,因此; 我的原始映射现在工作正常.

我不确定这个行为改变的弹簧版本是哪个版本.

小智 158

您可以将@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;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我已从上面的示例中删除了defaultValue,但是如果您希望接收未完全设置的请求,则可能需要包含它:

http://example.com/test
Run Code Online (Sandbox Code Playgroud)

  • 只是对此的更新,spring的最新版本实际上不再需要空检查,因为spring中包含了所需的行为,空值将导致使用默认值. (6认同)
  • 过时的答案,最好的解决方案来自@AppLend (3认同)

App*_*end 90

您可以通过设置默认值来保留基本类型,在您的情况下只需添加"required = false"属性:

@RequestParam(value = "i", required = false, defaultValue = "10") int i
Run Code Online (Sandbox Code Playgroud)

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

  • 无论如何,当提供```defaultValue```时,隐含地```required == false``` (4认同)
  • 如果提供了参数但是为空则`defaultValue`不会生效. (4认同)

Ana*_*ore 8

您可以使用泛型类Integer而不是int来设置RequestParam,它将解决您的问题.

   @RequestParam(value= "i", defaultValue = "20") Integer i
Run Code Online (Sandbox Code Playgroud)


Abd*_*leh 5

您可以使用@Nullable默认值。

@Nullable @RequestParam(value = "i", defaultValue = "10") Integer i
Run Code Online (Sandbox Code Playgroud)