我正在尝试为我的模型类实现一个自定义验证器,该验证器自动装配我的自定义 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> {
}