是否可以让空 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 客户端发送空参数来解决这个问题,或者通过接受字符串值,并且只有当它们不是空的时候才进行解析。

更新 : Spring 的后续版本现在实现了最初想要的行为。

我在 Spring 4.3.5中刚刚测试过这个,发现这个行为现在实际上会将 null 值转换为默认值,而不会引发 NumberFormatException,因此; 我最初的映射现在工作得很好。

我不确定这种行为的改变是春天的哪个版本。

307936 次浏览

您可以将@RequestParam 类型更改为 Integer 并使其不是必需的。这将允许您的请求成功,但之后它将为空。您可以在控制器方法中显式地将其设置为默认值:

@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

您可以通过设置默认值来保持基元类型,在您的情况下,只需添加 “必要 = 虚假”属性:

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

附言。 Spring 文档中的这一页可能会很有用: 注释类型 RequestParam

你也可以这样做

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

您可以设置 RequestParam,使用泛型类 Integer 代替 int,它将解决您的问题。

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

这在2013年被认为是一个错误: https://jira.spring.io/browse/SPR-10180

并且在3.2.2版本中得到了修复。在此之后的任何版本中都不会出现问题,您的代码应该能够正常工作。

可以使用具有默认值的 @Nullable

@Nullable @RequestParam(value = "i", defaultValue = "10") Integer i