如何注册自定义Spring Validator并实现自动依赖注入?
如何让自定义Spring Validator被Spring自动检测并注入依赖?
要实现和ConstraintValidator一样的自动检测、实例化及依赖注入效果,只需按以下步骤操作:
1. 实现Validator接口并标记为Spring组件
让自定义校验器类实现Spring的Validator接口,同时添加@Component注解,这样Spring会自动扫描并实例化该类,还会自动注入构造函数中的依赖Bean。
示例代码:
@Component public class UserValidator implements Validator { private final UserRepository userRepository; // 构造函数注入所需依赖 public UserValidator(UserRepository userRepository) { this.userRepository = userRepository; } @Override public boolean supports(Class<?> clazz) { // 指定该校验器支持的目标类 return User.class.equals(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User) target; // 结合依赖Bean实现校验逻辑 if (userRepository.existsByEmail(user.getEmail())) { errors.rejectValue("email", "user.email.duplicate", "邮箱已被注册"); } } }
2. 直接注入使用自定义校验器
在需要校验的地方(如服务层、控制器层),通过构造函数注入自定义的Validator实例,直接调用校验方法即可。
示例代码(服务层使用):
@Service public class UserService { private final UserValidator userValidator; private final UserRepository userRepository; public UserService(UserValidator userValidator, UserRepository userRepository) { this.userValidator = userValidator; this.userRepository = userRepository; } public void createUser(User user) { // 创建Errors对象用于存储校验错误 Errors errors = new BeanPropertyBindingResult(user, "user"); userValidator.validate(user, errors); // 校验不通过时抛出异常或处理错误 if (errors.hasErrors()) { throw new IllegalArgumentException("用户信息校验失败:" + errors.getAllErrors()); } userRepository.save(user); } }
3. (可选)与JSR-380 Bean Validation整合
如果希望在使用@Valid注解时同时触发自定义Spring Validator的校验,可以配置全局的LocalValidatorFactoryBean,将自定义校验器与Bean Validation的校验器组合起来。
示例配置类:
@Configuration public class ValidationConfig { private final UserValidator userValidator; public ValidationConfig(UserValidator userValidator) { this.userValidator = userValidator; } @Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); // 组合Bean Validation校验器和自定义Spring Validator factoryBean.setValidator(new CompositeValidator(Arrays.asList( factoryBean.getValidator(), userValidator ))); return factoryBean; } }
内容的提问来源于stack exchange,提问作者ugabade
相关产品推荐
相关产品推荐

