@Autowired字段为空

时间:2019-03-19 19:12:53

标签: spring spring-mvc bean-validation

自动装配可在应用程序中的任何地方使用,但在此自定义验证注释类内部除外,该类从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();
        }

1 个答案:

答案 0 :(得分:0)

您的自定义注释@UniqueUsername实例化并调用您的ValidatorUniqueUsername,但是即使被@Component注释,它也不会注入。

因此,ValidatorUniqueUsername中将自动插入的所有资源都不会被注入。

您可以尝试将其添加到您的@Configuration

@Bean
public Validator validatorFactory() {
    return new LocalValidatorFactoryBean();
}

查看更多here(以下摘录):

  

在春季,如果我们将LocalValidatorFactoryBean注册为引导javax.validation.ValidatorFactory,则自定义ConstraintValidator类将作为Spring Bean加载。这意味着我们可以在验证器类中受益于Spring的依赖项注入。