【发布时间】:2013-10-25 14:37:30
【问题描述】:
我正在尝试为我的模型类实现一个自定义验证器,它可以自动装配我的自定义 bean(通过 @Component 声明)。
在此,我关注了Spring documentation on that topic。我的AuthenticationFacade对象是按照this tutorial实现的。
但是,在运行我的测试时,Validator 对象中的 autowired 属性始终是 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;
}
输入createArticle 方法的Errors 对象旨在来自Spring 控制器,该控制器获得一个带有@Valid 注释的模型对象。
存储库,ArticleRepository.java,使用 Spring Data JPA 的 JpaRepository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}
【问题讨论】:
标签: java spring dependency-injection spring-security bean-validation