是否可以让空的 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
未设置(null
为 Integer
,空字符串为 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?的主要内容,如果未能解决你的问题,请参考以下文章