2

@Transactional アノテーションを持つクラス内のメソッドで使用するカスタム メソッド アノテーション (@EventListener) があります。

以下はクラスのサンプルです

@Component
@Transactional
public class someClass {

    @EventListener
    public void someMethod() {

    }
}

クラスは、コンテキスト ファイル コンポーネント スキャンに含まれるパッケージ内にあります。ApplicationContextAware を実装する別のクラスで、クラスのメソッドに @EventListener アノテーションがあるかどうかを確認します。@Transactional がクラスに存在する場合、何らかの奇妙な理由で、カスタム アノテーションが失われます。

これは、メソッドの注釈を確認する方法です。

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

    System.out.println("SCANNING :::::: " + beanName);

    for (Method method : bean.getClass().getMethods()) {

        for(Annotation a : method.getAnnotations()) {
            System.out.println("\t>>>>> " + a.toString());
        }

    ... 

注釈を付けるクラス内の他のメソッド注釈を台無しにすることなく @Transactional を使用する方法はありますか?

編集: Spring - @Transactional - バックグラウンドで何が起こるかを投稿した後、これを見つけました。- ある種のプロキシが作成されているようです。これにより、注釈が「消える」ように見えます。元のクラスへの参照を取得する方法はありますか?

4

1 に答える 1

3

私は自分の質問に対する答えを見つけ、他の誰かが同じ問題を抱えている場合に備えてここに投稿しました。@Transactionalクラスはプロキシされるため、元のプロキシされたクラスを取得する必要があったため、次を追加しました。

    Class clazz;

    // if this was proxied by Spring, get the original class name
    clazz = AopUtils.getTargetClass(bean);
    if(clazz == null) {
        clazz = bean.getClass();
    }

    for (Method method : clazz.getMethods()) {

AopUtils.getTargetClassを使用すると、元のクラスが取得されます。nullが返された場合は、クラスがプロキシされていないことを意味するため、bean.getClass()を使用します。

于 2013-01-19T08:49:12.567 に答える