我正在学习spring-boot,我正在为@PostMapping添加Validation,但不知何故,它总是创建一个对象,即使值无效。
医院.java
public class Hospital {
private Integer id;
@Size(min = 2)
private String name;
@Size(min = 2)
private String city;
public Hospital(Integer id, String name, String city) {
this.id = id;
this.name = name;
this.city = city;
}
控制器
@Autowired
HospitalData data;
...
@PostMapping("/hospital")
public ResponseEntity<Hospital> addHospital(@Valid @RequestBody Hospital hospital){
Hospital newHospital = data.addHospital(hospital);
URI location = ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(newHospital.getId()).toUri();
return ResponseEntity.created(location).build();
}
pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
之前我在使用Spring 2.3.10 RELEASE时添加了以下依赖项,但它不起作用,所以我添加了以上依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我创建了一个测试应用程序来重现代码的状态。正如在评论中所说的,您提供的代码肯定会起作用。您肯定不需要为该方法提供BindingResult
。Spring Boot抛出MethodArgumentNotValidException,因此如果验证失败,则返回错误的请求http状态。
我创建了一个项目,内容如下:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
</parent>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
DemoEntity:
public class DemoEntity {
@NotNull
public String name;
@Size(min = 3)
public String greeting;
}
DemoController:
@Controller
public class DemoController {
@PostMapping("/post")
public ResponseEntity<DemoEntity> put(@Valid @RequestBody DemoEntity demoEntity) {
return ResponseEntity.ok(demoEntity);
}
}
现在,我的请求就是这样:
姓名 | 问候 | 结果 | |
---|---|---|---|
Peter | 先生 | 400||
Stephen先生 | 200 | ||
Clara | 空 | 200//tr>Jenny
您需要在表单对象之后立即注入BindingResult对象作为参数,然后手动检查是否存在任何错误。
请参阅https://spring.io/guides/gs/validating-form-input/创建一个Web控制器作为一个很好的例子,说明如何在控制器中完成这项工作。