概述
这两个注解的作用都是简化 校验
@Valid
Spring 注解
Maven 依赖
如果是springboot项目,这个依赖存在于web开发包里面,如下
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.0.5.RELEASE</version>
</dependency>
如果不是springboot项目,则需要引入下述依赖
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version>
</dependency>
使用
在Controller 对应方法上,参数前面加上 @Valid 注解,表示我们对这个对象属性需要进行验证,如下
@PostMapping(value = "/add")@Updatepublic void add(@RequestBody @Valid User user, BindingResult bindingResult) {// 新增操作}
User:需要验证的对象熟悉,类属性如下
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;@Data
public class Employee {/** 姓名 */@NotBlank(message = "请输入名称")@Length(message = "名称不能超过个 {max} 字符", max = 10)public String name;/** 年龄 */@NotNull(message = "请输入年龄")@Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)public Integer age;}
BindingResult:存放验证结果,对验证结果的使用如下
@PostMapping(value = "/add")@Updatepublic String add(@RequestBody @Valid User user, BindingResult bindingResult) {// 新增操作if (bindingResult.hasErrors()){// 验证有误,返回第一条错误信息return bindingResult.getAllErrors().get(0).gtetDefaultMessage();}return "新增成功";}
@Validated
@Validated 是在 @Valid 基础上,做的一个升级版
在使用 @Valid 进行验证的时候,我们需要用一个对象去接收校验结果,最后根据校验结果判断,从而提示用户
而 如果在 校验的对象前面添加上 @Validated 注解,则不需要那个对象去接收 校验结果
@PostMapping(value = "/add")@Updatepublic void add(@RequestBody @Validated User user) {// 新增操作}
但是会直接报错404,需要通过捕获异常的方式,将该异常进行捕获
- 创建一个校验异常捕获类 ValidExceptionHandler ,
- 然后打上 @RestControllerAdvice 注解,该注解表示他会去抓所有 @Controller 标记类的异常,
- 并在异常处理后返回以 JSON 或字符串的格式响应前端
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class ValidExceptionHandler {@ExceptionHandler(BindException.class)public String validExceptionHandler(BindException exception) {return exception.getAllErrors().get(0).getDefaultMessage();}}
二者对比
第一点:@Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行
第二点:@Validated 使用起来要比 @Valid 方便一些
,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁
第三点: 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效
第四点:@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示
。
具体的注解使用:博客