1

私のカスタム Bean を自動配線するモデル クラスのカスタム バリデーターを実装しようとしています ( で宣言されてい@Componentます)。これで、そのトピックに関するSpringのドキュメントに従いました。私のオブジェクトは、このチュートリアルAuthenticationFacadeに従って実装されています。

ただし、テストを実行すると、Validatorオブジェクトの autowired 属性は常にnull. 何故ですか?

私のコードの関連部分は次のとおりです。

私のカスタム BeanAuthenticationFacadeImpl.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> {
}
4

2 に答える 2

0

Validator クラスの Dependency Injection を捨て、代わりAuthenticationFacadeImplにコンストラクターで のインスタンスをインスタンス化することで、今のところこれを解決しました。コードでバリデーターを明示的に呼び出さずに@Valid、コントローラーでの使用をモデルのカスタムバリデーター + 属性と組み合わせる方法は、まだ興味深いでしょう...@Autowired

于 2013-10-25T17:08:52.547 に答える
0

バリデーターが Spring コンテキスト外でインスタンス化されている場合、Spring の AOP @Configurableマジックを使用してそれをコンテキストに登録し、自動配線作業を取得できます。必要なのは、注釈を付けHasAnyRoleConstraintValidator@Configurableコンパイル時またはロード時のアスペクト ウィービングを有効にすることだけです。

于 2014-01-03T21:54:55.007 に答える