java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot异步处理@NotBlank或@NotNull注释校验不生效

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);
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文