Spring中的@RequestParam如何处理Guava的Optional?
问题内容:
@RequestMapping(value = "/contact.html", method = RequestMethod.POST)
public final ModelAndView contact(
@RequestParam(value = "name", required = false) Optional<String> name) {
如果不需要参数值并且什么也不发送,Spring如何@RequestMapping
处理Guava库中的Optional
from
?
那将会:
- 设置
null
- 设置
Optional.absent()
可以Optional.fromNullable(T)
用来接受请求吗?
问题答案:
编辑(2015年10月): Spring 4 java.util.Optional
开箱 即用Optional
(从Java 8开始)处理并
保证其 本身不为null ,但最初的问题是关于Guava
在此特定情况下强烈反对com.google.common.base.Optional
使用哪种用法@RequestParam
(因为它 可以
为null)。
原始答案 (关于番石榴Optional
):
不要那样做,只需使用String
并让Spring null
以它的方式处理即可。
Optional<T>
应该用作
返回值
,很少用作参数。在这种特殊情况下,Spring会将缺少的"name"
参数映射到null
,因此,即使在实现自定义属性编辑器后,您也将完成null
检查:
@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final Optional name) {
return "name: " + (name == null ? "null" : name.get());
}
这是完全不必要的(和滥用Optional
),因为可以通过以下方法实现:
@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final String name) {
return "name: " + (name == null ? "null" : name);
}