How does @RequestParam in Spring handle Guava's Optional?

后端 未结 3 1934
暗喜
暗喜 2021-02-05 02:36
@RequestMapping(value = \"/contact.html\", method = RequestMethod.POST)
public final ModelAndView contact(
        @RequestParam(value = \"name\", required = false) Opti         


        
3条回答
  •  Happy的楠姐
    2021-02-05 03:16

    EDIT (October 2015): Spring 4 handles java.util.Optional (from Java 8) out of the box and guarantees that Optional itself is not null, but original question was about Guava's com.google.common.base.Optional which usage as @RequestParam is highly discouraged in this specific case (because it can be null).

    ORIGINAL ANSWER (about Guava's Optional):

    Don't do that, just use String and let Spring handle null in its way.

    Optional is supposed to be used as return value and rarely as a parameter. In this particular case Spring will map missing "name" parameter to null, so even if after implementing custom property editor you'll finish with null check:

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

    which is completely unnecessary (and missuses Optional), because it can be achieved with:

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

提交回复
热议问题