在最新的Spring v4中使用带有可选主体的@RequestBody

Mik*_*ell 29 java spring spring-mvc httprequest

@RequestBody在Spring中使用注释时,如何在REST API调用中使body可选?

使用Spring的最新版本,如果使用@RequestBody注释,它会使客户端始终发送正文而不使其成为可选项.

我试过@RequestBody (required=false)但是没有用,我的请求仍然是null.

如何在不强制要求的情况下将请求转换为正确的必需对象?

例如:

@RequestMapping(value="/add/employee", method=RequestMethod.POST)
public void addEmployee(@RequestBody Employee employee){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,我想使用POST添加员工,但没有正文.我怎么做?如果我发送空体,春天最新版本抛出错误"身体缺失"...

Jac*_*son 39

@Santosh,我不确定你指的是哪个必要的论点.迈克已经提到他尝试使用@RequestBody (required=false)并且请求仍然是空的.也许你可以详细说明并举例说明.

@Mike,可能你可以尝试使用另一个独立的转换器来满足你的需求.

注意:我注意到Spring v4.1.6的相同问题,迈克可能正在使用它,因为他提到他正在使用最新版本.


cil*_*ilf 13

您可以使用java.util.Optional

@RequestMapping(value="/add/employee", method=RequestMethod.POST)
public void addEmployee(@RequestBody Optional<Employee> employee){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 不建议对参数使用可选类型,intellij 给出的消息请参阅:https://www.wangler.io/blog/2017/java8-Optionals.html#:~:text=Optional%20was%20Design%20to%20provide ,到%20be%20Serialized%2C%20which%20java. (3认同)
  • @alegria imo,这是一个愚蠢的警告。可选参数非常有用。 (2认同)

San*_*shi 8

我猜你使用的是高于3.2的弹簧版本,因为版本存在问题.@RequestBody应该有一个必需的参数来允许请求体是可选的

看看以下链接 Spring @RequestBody Anotation

@RequestBodyBody需要和参数必需,默认情况下为true.将其指定为false将对您有所帮助

需要公共抽象布尔值

是否需要身体内容. 默认值为true,导致在没有正文内容的情况下抛出异常.如果您希望在body内容为null时传递null,请将其切换为false.

  • 当使用String作为RequestBody(required = false)时,默认值不会为null,而是为{}.不知道为什么,但花了我一些时间,并认为我分享. (4认同)