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库中Optionalfrom

那将会:

  • 设置 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);
}