2011-07-14 11 views
1

CDIを使用するプロジェクトは3つあります。プロジェクトAには、トランザクション制御のためのインターセプタがあります。@AroundInvoke(CDIプロジェクト)

プロジェクトBは、プロジェクトAを使用してデータベースにデータを保存します。これらの単位テストを実行すると、すべてが成功します。

プロジェクトCは、統合テストにプロジェクトBを使用します。これらのテストは、インターセプタから@AroundInvokeアノテーションを検出すると失敗します。

何が問題になりますか?インターセプタは、プロジェクトB beans.xmlにのみあります。

例外スタックトレースは私の心をクリアしません。ジャーナリストのエラーだけが表示されます。デバッグすると、問題はWeld内のboostrap.deploybeans()から発生することがわかりました。ですから、インターセプタクラスの@AroundInvokeについてコメントしたところ、テストではすべてうまくいっていましたが、データベースに挿入されました。私は、挿入のためのトランザクションを作成するインターセプタを削除したために起こると思います。

コード:

1)、注釈このアノテーションのインターセプタを定義するプロジェクトAが存在します。例:私はこのプロジェクトが空/META-INF/beans.xmlを持っている必要があります

/注釈/

@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE, ElementType.METHOD}) 
public @interface Transactional { 
} 

/インターセプター/

@Interceptor 
@Transactional 
public class TransactionalInterceptor implements Serializable { 
    … 
    @AroundInvoke 
    public Object intercept(InvocationContext context) throws Exception { 
     … 
    } 
    … 
} 

と思います。

2)プロジェクトA.例からインターセプターを使用して別のプロジェクトBがあります:

public class ProjectBClass { 
    … 
    @Transactional 
    public void interceptorMethod() { 
     … 
    } 
    … 
} 

だから私は、このプロジェクトは、インターセプタを有効/META-INF/beans.xmlを持たなければならないと思います。例:

<beans> 
<interceptors> 
<class>br.com.company.projecta.TransactionalInterceptor</class> 
</interceptors> 
</beans> 

3)最後に、プロジェクトB.例からメソッドを使用するプロジェクトのCがあります:

は、私はそれは/ META-INF /豆を持っている必要がありますかどうかわからないです。 xml。

4)この同じプロジェクトでは、メソッドをテストする統合テストがあります。例:

public class ProjectCClassTest { 
    … 
    @Test 
    public void test() { 
     ProjectCClass projectCClass = new ProjectCClass(); 
     projectCClass.testerMethod(); 
     … 
     Assert.assertEquals(…); 
    } 
    … 
}  
+0

なぜ失敗するのですか?それは例外を投げるか?予想される結果は返されませんか?テストで発生する問題は何ですか? – brandizzi

+0

1つのアカウントから投稿してください。複数ある場合は、[マージ]することができます(http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-登録解除)。 – trashgod

答えて

0

あなたはすべてのプロジェクトでMETA-INF/beans.xml必要があります(.jarファイルとしてパッケージ化)

あなたは、クラス自身をインスタンス化してはいけません。そうした場合、CDIは管理されません。 CDIをインスタンス化しましょう。例えば、look here