1

我正在尝试为我的模型类实现一个自定义验证器,该验证器自动装配我的自定义 bean(通过 声明@Component)。在此,我遵循了有关该主题的 Spring 文档。我的AuthenticationFacade对象是根据本教程实现的。

但是,在运行我的测试时,对象中的 autowired 属性Validator始终为null. 这是为什么?

以下是我的代码的相关部分:

我的自定义 bean ,AuthenticationFacadeImpl.java

@Component
public class AuthenticationFacadeImpl implements AuthenticationFacade {
    boolean hasAnyRole(Collection<String> roles) {
        // checks currently logged in user roles
    }
}

我的自定义约束HasAnyRoleConstraint.java

@Constraint(validatedBy = HasAnyRoleConstraintValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD})
public @interface HasAnyRole {
    String[] value();
    String message() default "{HasAnyRole}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

我的自定义验证器HasAnyRoleConstraintValidator.java

@Component
public class HasAnyRoleConstraintValidator implements ConstraintValidator<HasAnyRole, Object> {
    @Autowired
    AuthenticationFacade authenticationFacade;

    private String[] roles;

    @Override
    public void initialize(HasAnyRole hasAnyRole) {
        this.roles = hasAnyRole.value();
    }

    @Override
    public boolean isValid(Object target, ConstraintValidatorContext constraintValidatorContext) {
        return target == null || authenticationFacade.hasAnyRole(Arrays.asList(this.roles));
    }
}

模型类Article.java

@Entity
public class Article {
    // ...
    @HasAnyRole({"EDITOR", "ADMIN"})
    private String title;
    // ...
}

服务对象ArticleServiceImpl.java

@Service
public class ArticleServiceImpl implements ArticleService {
    @Autowired
    private ArticleRepository articleRepository;

    @Autowired
    private AuthenticationFacade authenticationFacade;

    @Autowired
    private Validator validator;

    @Override
    @PreAuthorize("hasAnyRole('ADMIN', 'EDITOR')")
    public boolean createArticle(Article article, Errors errors) {
        articleRepository.save(article);
        return true;
    }

Errors输入该方法的对象旨在createArticle来自 Spring 控制器,该控制器获得一个带有@Valid注释的模型对象。

存储库,ArticleRepository.java使用 Spring Data JPA 的JpaRepository

public interface ArticleRepository extends JpaRepository<Article, Long> {
}
4

2 回答 2

0

如果您的验证器是在 Spring 上下文之外实例化的,那么您可以使用 Spring 的 AOP @Configurable魔法在上下文中注册它并进行自动装配工作。您所需要的只是注释HasAnyRoleConstraintValidator@Configurable启用编译时间或加载时间方面的编织。

于 2014-01-03T21:54:55.007 回答
0

我现在通过放弃 Validator 类的依赖注入来解决这个问题,而是AuthenticationFacadeImpl在构造函数中实例化 的实例。仍然会很有趣,尽管如何将@Valid控制器中的使用与@Autowired模型中的自定义验证器+属性结合起来,而无需在代码中显式调用验证器......

于 2013-10-25T17:08:52.547 回答