对请求主体对象进行空检查

时间:2018-10-06 14:43:32

标签: spring spring-mvc spring-boot

是否可以进行集成测试以进行空检查。 我传递了空值。

HttpEntity<Employee> entity = new HttpEntity<Employee>(null, headers);
restTemplate.exchange(url, httpMethod, entity, String.class);

我收到以下错误。

  

{“时间戳”:“ 2018-10-06T14:33:52.113 + 0000”,“状态”:400,“错误”:“错误请求”,“消息”:“缺少所需的请求正文:”}

@RestController
public class EmployeeController {

    @PostMapping(value = "/employee/save", produces = "application/json")
    public Employee save(@RequestBody Employee employee){
        if(employee==null){
            throw new RuntimeException("Employee is null");
        }
    }
}

class Employee {

}

3 个答案:

答案 0 :(得分:0)

@RequestBody(required=false) Employee employee

请尝试使用@RequestBody中的必需选项。

这里的问题是spring mvc中的映射。

required

默认为true,如果没有正文内容,则会引发异常。如果您希望在正文内容为null时传递null,则将其切换为false。

@RequestBody Employee employee

如果employee不为null,则仅处理您的方法的请求。然后,它考虑了正确的映射并将请求传递给此方法并进行处理。因此,此处的check null条件将是不必要的。

答案 1 :(得分:0)

我不确定这是否可行,但是我会说这是一个不好的做法。

根据RFC 7231:

  

POST方法用于请求源服务器接受   请求中包含的表示形式,作为要由   目标资源。

由于您已经为控制器的PostMapping添加了注释,因此服务器应该有请求正文。我看不到为空或空的请求正文编写集成测试的价值。

如果我们查看HTTP请求结构,

  

POST /您的URL HTTP / 1.1
  主持your_host
  内容类型 ...   ContentLength ...

     

正文第1行

null和empty有什么区别?

答案 2 :(得分:0)

您可以使用javax验证框架来检查@requestbody是否为空

请使用以下方法:一定会解决您的问题。

Maven Dependency:
   <dependency>
       <groupId>javax.validation</groupId>
       <artifactId>validation-api</artifactId>
       <version>1.1.0.Final</version>
   </dependency>

@RestController
public class EmployeeController {

     @PostMapping(value = "/employee/save", produces = "application/json")
     public Employee save(@NotNull @RequestBody Employee employee){

     }
}