是否可以让空的请求参数值使用默认值?

2022-08-31 07:42:08

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

@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现在实现了最初所需的行为。

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

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


答案 1

您可以将@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;
    }
    // ...
}

我已经从上面的示例中删除了 defaultValue,但是如果您希望在根本没有设置它的情况下接收请求,则可能需要包含它:

http://example.com/test

答案 2

您可以通过设置默认值来保留基元类型,在您的例子中,只需添加“required = false”属性:

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

附言:Spring文档中的此页面可能有用:注释类型请求参数


推荐