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

时间:2015-02-24 03:23:16

标签: java spring spring-mvc httprequest

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

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

我试过了@RequestBody (required=false),但那并没有起作用&我的请求仍然是空的。

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

例如:

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

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

4 个答案:

答案 0 :(得分:33)

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

@Mike,可能你可以尝试使用另一个能满足你目的的独立转换器。

注意:我注意到Spring v4.1.6&迈克可能正在使用它,因为他提到他正在使用最新版本。

答案 1 :(得分:8)

我猜您使用的是版本高于3.2的弹簧版本。 @RequestBody should have a required parameter to allow a request body to be optional

查看以下链接 Spring @RequestBody Anotation

@RequestBody正文需要和参数必需,默认情况下为true。将其指定为false将有助于您

  

公共摘要布尔需要

     

是否需要身体内容。      如果没有正文内容,默认为真会导致抛出异常。如果您希望在正文内容为空时传递null,则将其切换为false。

答案 2 :(得分:0)

您可以使用java.util.Optional

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

答案 3 :(得分:0)

我使用 @RequestBody(required = false) 解决了这个问题,请参见以下示例:

@PutMapping("approve/{id}")
public void approve(@PathVariable("id") Long id, @RequestBody(required = false) DemoObject demo) {
  log.info("demo == null -> " + (demo == null));
}

注意:在前端应用程序中,我放置了空值

this.http.put('approve/' + id, null)
.then((response) => {
  ...
})
.catch(error => {
  ...
})