我正在学习springboot,我正在为@postmapping添加验证,但不知怎么的,它总是创建一个对象,即使它的值无效。
医院.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>
之前我在使用spring2.3.10版本时添加了下面的依赖项,但是它不起作用,所以我添加了上面的依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2条答案
按热度按时间0x6upsns1#
我创建了一个复制代码状态的测试应用程序。正如评论中所说的,你提供的代码肯定能用。你绝对不需要提供
BindingResult
方法。spring引导抛出methodargumentnotvalidexception,因此在验证失败时返回错误请求http状态。我创建了一个包含以下内容的项目:
pom.xml文件
人口实体:
演示控制器:
现在,我的请求就是这样:
姓名问候结果表400StephenMonsieur200Claranull200Jennymadamme200
从上表可以看出,什么时候
greeting
是null
结果是ok状态。如果你想保证字符串至少min
字符长且不为空,您需要显式地声明它。例如,如果您想验证可选字段(如手机号码)的话。你知道,它应该有n个数字长,并且只包含数字,但是你不想强制它。就像我上面的问候。
7cjasjjr2#
您需要将bindingresult对象作为紧跟在窗体对象之后的参数注入,然后手动检查是否有任何错误。
看到了吗https://spring.io/guides/gs/validating-form-input/ 创建一个web控制器,这是一个很好的示例,说明如何在控制器中执行此操作。