自动装配在应用程序中的任何位置都可以工作,除了在这个自定义验证注释类中,从内部调用isValid()方法时它是null。
javax.validation:validation-api: 2.0.1.Final
org.hibernate:hibernate-validator: 5.0.1.Final
spring: 5.1.4.RELEASE
@Component
public class ValidatorUniqueUsername implements ConstraintValidator<UniqueUsername, String> {
@Autowired
AccountService jpaAccountService;
@Override
public void initialize(UniqueUsername constraintAnnotation) { }
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
return username != null && jpaAccountService.findByUsername(username) == null;
}
}
@Entity
...
public class Account extends BaseEntity<Long> implements Serializable{
@NotEmpty
@UniqueUsername
private String username;
}
@Configuration
public class AppConfig implements AsyncConfigurer {
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
@Bean
public static LocalValidatorFactoryBean validatorFactory() {
return new LocalValidatorFactoryBean();
}
您的自定义注释@UniqueUsername
实例化并调用您的ValidatorUniqueUsername
但它不注入它,即使它用@Component
注释。
因此,你的ValidatorUniqueUsername
中没有任何自动装配的资源将被注入。
您可以尝试将此添加到您的@Configuration
:
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
查看更多here(摘录如下):
在Spring中,如果我们将LocalValidatorFactoryBean注册到bootstrap javax.validation.ValidatorFactory,那么自定义ConstraintValidator类将作为Spring Bean加载。这意味着我们可以在验证器类中获得Spring的依赖注入。