@Autowired字段为空

问题描述 投票:0回答:1

自动装配在应用程序中的任何位置都可以工作,除了在这个自定义验证注释类中,从内部调用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();
        }
spring spring-mvc bean-validation
1个回答
0
投票

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

因此,你的ValidatorUniqueUsername中没有任何自动装配的资源将被注入。

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

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

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

在Spring中,如果我们将LocalValidatorFactoryBean注册到bootstrap javax.validation.ValidatorFactory,那么自定义ConstraintValidator类将作为Spring Bean加载。这意味着我们可以在验证器类中获得Spring的依赖注入。

© www.soinside.com 2019 - 2024. All rights reserved.