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);
}
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
