144

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

@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: For input string: ""'

我可以通过阻止 javascript 客户端发送空参数或通过接受字符串值并仅在未发现它们为空时才解析来解决此问题。

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

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

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

4

6 回答 6

205

您可以将 @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
于 2012-09-22T00:18:44.957 回答
117

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

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

PS Spring文档中的此页面可能有用: Annotation Type RequestParam

于 2014-02-20T08:40:02.803 回答
17

您可以设置 RequestParam,使用通用类 Integer 而不是 int,它将解决您的问题。

   @RequestParam(value= "i", defaultValue = "20") Integer i
于 2017-02-19T09:38:24.987 回答
2

您可以使用@Nullable默认值。

@Nullable @RequestParam(value = "i", defaultValue = "10") Integer i
于 2021-08-25T11:16:56.007 回答
1

你也可以做这样的事情 -

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i
于 2017-01-19T05:05:06.757 回答
1

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

并在 3.2.2 版中修复。之后的任何版本都不应出现问题,并且您的代码应该可以正常工作。

于 2018-09-01T09:16:56.323 回答