springboot异步处理@NotBlank或@NotNull注释校验不生效问题
作者:今天写bug了吗?
这篇文章主要介绍了springboot异步处理@NotBlank或@NotNull注释校验不生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
问题描述
在springboot中开启异步后,再异步方法中使用service层方法进行插入,如果开始了@NotBlank 或者@NotNull的时候,发现校验不生效。
解决方式
实现方法:
@Data public class A{ @NotBlank(message = "name不能为空") private String name; @NotBlank(message = "age") private String age; }
public class IAServiceImpl implements IAService { //获取校验的Bean private final Validator validator; public IAServiceImpl() { this.validator = Validation.buildDefaultValidatorFactory().getValidator(); } @Async public void export(A a) { //异步方式中调用A插入,失败则可以获取到message中的信息了 try{ insert(a) }catch(Exception e){ logger.error("插入失败:",e.getMessage()) } } @Override public int insert(@Validated A a) { //获取校验 Set<ConstraintViolation<A>> violations = validator.validate(A); if (!violations.isEmpty()) { throw new RuntimeException(violations.iterator().next().getMessage()); } else { return aMapper.insert(A); } } }
扩展:如何开启分组校验
如果使用了分组校验,则需要添加参数
实现方法:
@Data public class A{ //定义插入接口 public interface Insert {} public interface Update {} @NotBlank(message = "name不能为空", groups = {Insert.class}) private String name; @NotBlank(message = "age",groups = {Update.class}) private String age; }
public class IAServiceImpl implements IAService { //获取校验的Bean private final Validator validator; public IAServiceImpl() { this.validator = Validation.buildDefaultValidatorFactory().getValidator(); } @Async public void export(A a) { //异步方式中调用A插入,失败则可以获取到message中的信息了 try{ insert(a) }catch(Exception e){ logger.error("插入失败:",e.getMessage()) } } @Override public int insert(@Validated A a) { //获取校验 开启分组后这样就只会校验插入分组的校验信息 Set<ConstraintViolation<A>> violations = validator.validate(A,A.Insert.class); if (!violations.isEmpty()) { throw new RuntimeException(violations.iterator().next().getMessage()); } else { return aMapper.insert(A); } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。