是否可以使用defaultValue空RequestParam值?

时间:2012-09-06 09:08:24

标签: java spring spring-mvc

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

@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春季对此进行了测试,并且发现该行为现在实际上将空值转换为默认值而不会引发NumberFormatException,因此;我的原始映射现在可以正常工作。

我不确定这种行为改变的弹簧版本是什么版本。

5 个答案:

答案 0 :(得分:145)

您可以将@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

答案 1 :(得分:85)

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

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

P.S。 Spring文档中的这个页面可能很有用: Annotation Type RequestParam

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

您也可以这样做 -

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

答案 4 :(得分:0)

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

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