是否可以让空的 RequestParam 值使用 defaultValue?

Posted

技术标签:

【中文标题】是否可以让空的 RequestParam 值使用 defaultValue?【英文标题】:Is it possible to have empty RequestParam values use the defaultValue? 【发布时间】:2012-08-31 01:41:22 【问题描述】:

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

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

我刚刚在 spring 4.3.5 中对此进行了测试,发现该行为现在实际上会将 null 值转换为默认值,而不会引发 NumberFormatException,因此;我的原始映射现在可以正常工作了。

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

【问题讨论】:

该参数肯定是一个整数类型来引发该异常? 我不是spring专家,但不设置时是否使用默认值?即如果您的请求是example.com/test?当您使用example.com/test?i= 时,i 存在并设置为“”,因此不使用默认值 感谢 amir75,不小心提供了 String 类型。 user902383,这是正确的,但对于整数值,我更希望 null/空值使用 defaultValue。 【参考方案1】:

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

【讨论】:

只是对此的更新,最新版本的 spring 实际上不再需要 null 检查,因为 spring 包含了所需的行为,即空值将导致使用默认值。 过时的答案,最好的解决方案来自@AppLend 在现代 Spring 版本中,它被称为defaultValue,而value 只是name 的别名。【参考方案2】:

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

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

附: Spring文档中的这个页面可能有用: Annotation Type RequestParam

【讨论】:

谢谢,但您错过了标题中我的问题的重点。我要求提供空参数/test?i= 的能力,因为i 是空的,所以有默认值。 无论如何,当defaultValue被提供时,required == false隐含 如果提供了参数但为空defaultValue不生效。 至少对于@GetMapping 请求仍然不起作用。 defaultValue 未设置(nullInteger,空字符串为 String,失败,int 除外。:(【参考方案3】:

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

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

【讨论】:

【参考方案4】:

你也可以这样做——

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

【讨论】:

如果你有一个 defaultValue,就没有必要把它设为 Optional。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

您可以使用默认值@Nullable

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

【讨论】:

以上是关于是否可以让空的 RequestParam 值使用 defaultValue?的主要内容,如果未能解决你的问题,请参考以下文章

@RequestParam设置默认可以传空值

如何在Mongoose中让空值排在最后?

@RequestParam注解

spring 注解上传文件 @RequestParam

SQL中建视图关联表的一个字段有空值,导致视图中的数据不完整,想让空值到视图中也是空值怎么整

@RequestParam用法