Spring中的@RequestParam如何处理Guava的Optional?

And*_*ers 29 spring nullable spring-mvc optional guava

@RequestMapping(value = "/contact.html", method = RequestMethod.POST)
public final ModelAndView contact(
        @RequestParam(value = "name", required = false) Optional<String> name) {
Run Code Online (Sandbox Code Playgroud)

如果不需要参数值且没有发送任何内容,Spring如何@RequestMapping处理Optional来自Guava库的内容?

那将会:

  • 调成 null
  • 调成 Optional.absent()

可以Optional.fromNullable(T)用来接受请求吗?

Xae*_*ess 47

编辑(2015年10月): Spring 4处理java.util.Optional(来自Java 8)开箱即用并保证Optional本身不为空,但最初的问题是关于Guava的com.google.common.base.Optional用法,因为@RequestParam在这种特定情况下非常不鼓励(因为它可以为null).

原始答案(关于番石榴Optional):

不要这样做,只需使用String并让Spring处理null它的方式.

Optional<T>应该用作返回值,很少用作参数.在这种特殊情况下,Spring会将缺少的"name"参数映射到null,所以即使在实现自定义属性编辑器之后,您也将完成nullcheck:

@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final Optional name) {
  return "name: " + (name == null ? "null" : name.get());
}
Run Code Online (Sandbox Code Playgroud)

这是完全没必要的(和错误Optional),因为它可以通过以下方式实现:

@RequestMapping("foo")
@ResponseBody
public String foo(@RequestParam(required = false) final String name) {
  return "name: " + (name == null ? "null" : name);
}
Run Code Online (Sandbox Code Playgroud)