Поле @Autowired равно нулю - PullRequest
0 голосов
/ 19 марта 2019

Автопроводка работает везде в приложении, кроме внутри этого пользовательского класса аннотации проверки, где он равен нулю при вызове изнутри метода isValid ().

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 голосов
/ 19 марта 2019

Ваша пользовательская аннотация @UniqueUsername создает и вызывает ваш ValidatorUniqueUsername, но не внедряет его, даже если он помечен @Component.

И из-за этого ни один из ресурсов не будет автоматически подключен в вашемValidatorUniqueUsername будет введено.

Вы можете попытаться добавить это к своему @Configuration:

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

Подробнее здесь (выдержка ниже):

Весной, если мы зарегистрируем LocalValidatorFactoryBean для начальной загрузки javax.validation.ValidatorFactory, тогда пользовательские классы ConstraintValidator загружаются как Spring Bean.Это означает, что мы можем получить выгоду от внедрения зависимостей Spring в классах валидаторов.

...