快速校验实体类时,@Valid,@Validated,@NotNull注解⽆效的解决
⽬录
校验实体类参数内容不能为空时使⽤注解校验⽆效
使⽤@valid注解⾸先引⼊依赖
1、更换⽅法⼊参类型
2、错误内容过多
3、使⽤对象接收错误内容,按⾃⼰要求输出
springboot 校验机制 @Validated @Valid
1、探究原因
2、使⽤@Validated 实现校验机制
3、使⽤@Valid 实现校验机制
校验实体类参数内容不能为空时使⽤注解校验⽆效
使⽤@valid注解⾸先引⼊依赖
如果是SpringBoot项⽬,引⼊web开发包,就不需要再单独引⼊@valid依赖了、因为他存在于Web开发包中的最核⼼之中
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
如果不是SpringBoot项⽬,要在Maven的Pom中显式引⼊@valid依赖
<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层⾥⾯拿出来判断是否为空,其实可以直接通过实体类中的注释@NotNull直接校验,如图
但经过我的实验,不知道什么原因,在我的项⽬中并没有起到作⽤,解决如下
1、更换⽅法⼊参类型
在⽹上看到@Valid是可以⽤在⽅法、构造函数、⽅法参数和成员属性(字段)上,⽽我⼀开始controller层中使⽤的是json接收的,转换成实体类后再校验的,如图
修改如下:在controller接收数据时直接以对象接收,在⼊⼝中直接以注解进⾏校验
2、错误内容过多
此时对象字段校验⽣效,但是出错时返回的是很凌乱的内容,如图:
3、使⽤对象接收错误内容,按⾃⼰要求输出
上⾯的图⽚可看出,返回内容中defaultMessage就是想要输出的内容,所以在⽅法中添加⼀个接收错误信息的类型为BindingResult的对象,如果对象有数据,则输出错误数据,如图:
另⼀层⾯的实现了实体类的参数校验,⼤家如果有更好的⽅法可以留⾔交流
springboot 校验机制 @Validated @Valid
1、探究原因
在开发的过程中⼀直迷惑 @Validated 与 @Valid 的⽤法,有时候是@Validated ,有时候是@Valid 。虽然能够实现校验,但是还是不够明确何时能够⽣效,不了解他⽣效的情况
⾸先定位2个注解所属的包:
@Validated 在 spring-context 包下属于spring 提供的核⼼包
@Valid 在 validation-api 包下 2.0.2 版本
@Validated 是spring 核⼼包,是每个项⽬都有的,那么 api 是如何引⼊的? 查看maven 依赖
原来是在引⼊ Spring-boot-start-web 的时候,就引⼊了该依赖
两个注解存在不同的包,⽽@NotNull ,@Null ,@Size ,@Max 等校验注解是哪⾥的呢?
这些注解都是在 api 包下
2、使⽤@Validated 实现校验机制
情景⼀:查询参数是⼀个实体,Get 请求,在不添加任何注解的情况下,查询是正常的,实体参数字段都为null
现在需求 id 字段不能为空,在实体id 字段标记 @NotNull ,继续查询,发现注解没有⽣效
经过测试,只有请求实体参数列表前加@Validated 才会⽣效,即使@Validated 加在类上也⽆法⽣效
情景⼆:查询参数是基本或者引⽤类型字段,参数列表中加⼊ @NutNull 修改该字段。发现⽆法⽣效
经过测试:只有全局类上加@Validated 才会⽣效,即使参数列表中加⼊ @Validated 也⽆法⽣效
产⽣异常也有所不同:在校验⽣效的情况下,实体类校验产⽣的异常是:BindException , ⽽参数列表产⽣的异常是:ConstraintViolationException 3、使⽤@Valid 实现校验机制
场景⼀:与上述⼀致,只有@Valid 作⽤在参数列表前才会⽣效
场景⼆:@Valida 不管是左右在参数列表还是类上,都⽆法⽣效。只能使⽤@Validated 全局设置
结论:暂不清楚@Valid 设计出现的原因,所以的校验@Validate 均可以实现
附加全局异常捕获:
@RestControllerAdvice
public class GlobalException {
@ExceptionHandler({BindException.class})
public RespResult validationException(BindException exception){
List<ObjectError> errors = AllErrors();
if(!CollectionUtils.isEmpty(errors)){
StringBuilder sb = new StringBuilder();
errors.forEach(e->sb.DefaultMessage()).append(","));
return new RespResult(400, sb.toString());
}
return new RespResult(500, LocalizedMessage());
}
@ExceptionHandler({ConstraintViolationException.class})
public RespResult constraintViolationException(ConstraintViolationException exception){
Set<ConstraintViolation<?>> constraintViolations = ConstraintViolations();
if(!CollectionUtils.isEmpty(constraintViolations)){
StringBuilder sb = new StringBuilder();
constraintViolations.forEach(e->sb.Message()).append(","));
return new RespResult(400, sb.toString());
}
return new RespResult(500, LocalizedMessage());
}
}
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
>invalids
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论