You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot自定义校验注解报空指针:ProductService注入为空

解决自定义校验器中@Autowired服务为空的NPE问题

问题根源很明确:Spring默认不会把ConstraintValidator的实例纳入容器管理,直接用@Autowired注入ProductService自然会得到null;只有Post请求会触发请求体的参数校验(比如实体类上的@Valid注解),调用到这个自定义校验器,所以只有Post请求出现问题。

直接上解决方案:

  • 给你的IsExistsDbValidation校验器类加上@Component注解,让Spring接管它的实例化和依赖注入:

    @Component
    public class IsExistsDbValidation implements ConstraintValidator<IsExistsDb, String> {
    
        private final ProductService productService;
    
        // 推荐用构造器注入替代字段注入,从根源避免NPE
        @Autowired
        public IsExistsDbValidation(ProductService productService) {
            this.productService = productService;
        }
    
        @Override
        public void initialize(IsExistsDb constraintAnnotation) {
            // 初始化逻辑(如果需要)
        }
    
        @Override
        public boolean isValid(String sku, ConstraintValidatorContext context) {
            // 校验SKU是否存在,根据需求返回布尔值
            return !productService.existsBySku(sku);
        }
    }
    
  • 确保ProductService的实现类标注了@Service注解,且所在包被Spring的组件扫描覆盖(比如主启动类的包范围包含该服务类的包)。

  • 如果你用的是Spring Boot 2.3+,确认没有关闭自动校验配置,默认spring.mvc.validation.enabled=true是开启状态,无需额外修改。

补充说明:Get/Delete/Put请求的参数多为路径参数或请求参数,没有触发绑定在请求体实体类上的SKU校验注解,所以不会调用这个校验器,自然不会暴露NPE问题。

内容的提问来源于stack exchange,提问作者Sectore88j

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:47:34