自动装配可在应用程序中的任何地方使用,但在此自定义验证注释类内部除外,该类从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();
}
答案 0 :(得分:0)
您的自定义注释@UniqueUsername
实例化并调用您的ValidatorUniqueUsername
,但是即使被@Component
注释,它也不会注入。
因此,ValidatorUniqueUsername
中将自动插入的所有资源都不会被注入。
您可以尝试将其添加到您的@Configuration
:
@Bean
public Validator validatorFactory() {
return new LocalValidatorFactoryBean();
}
查看更多here(以下摘录):
在春季,如果我们将LocalValidatorFactoryBean注册为引导javax.validation.ValidatorFactory,则自定义ConstraintValidator类将作为Spring Bean加载。这意味着我们可以在验证器类中受益于Spring的依赖项注入。