私のカスタム Bean を自動配線するモデル クラスのカスタム バリデーターを実装しようとしています ( で宣言されてい@Component
ます)。これで、そのトピックに関するSpringのドキュメントに従いました。私のオブジェクトは、このチュートリアルAuthenticationFacade
に従って実装されています。
ただし、テストを実行すると、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;
}
Errors
メソッドに供給されるオブジェクトは、 Spring コントローラーから取得されることを意図しており、Spring コントローラーは注釈createArticle
付きのモデル オブジェクトに供給されます。@Valid
リポジトリ、ArticleRepository.java
は、Spring Data JPA のJpaRepository
public interface ArticleRepository extends JpaRepository<Article, Long> {
}