0

EJB の統合テストのために、Glassfish 3.1 で EJB 3.1 Embeddable EJBContainer を使用しようとしています。私が理解できないクラスローディングの問題があります。

私のejbはdum-ejb.jarに組み込まれています。彼らはEclipseLink JPAを使用しています。また、クラスローディングの問題に対処しながら、EJB クライアント jar dum-ejb-client.jar も作成します。クライアント jar には、EJB インターフェイスとエンティティ クラス (通常はパラメーターまたは戻り値) が含まれます。クライアント jar には、ドロップされる可能性のある不要なクラスも多数含まれています (ただし、それによって問題がどのように解決されるのかわかりません)。

問題は、EclipseLink がエンティティ クラスにバイトコード ウィービングを行うため、junit テストの実行時にエンティティ クラスがクラスパスに存在してはならないことです: http://www.java.net/forum/topic/glassfish/glassfish/embedded-グラスフィッシュとウィービング

これを実行して、dum-ejb.jar が含まれないようにクラスパスを構成できます。EJBContainer を使用してサービスを java.lang.Object としてルックアップし、リフレクションを介してそのメソッドを呼び出すと、テストは機能します。しかしもちろん、それは私がテストを書きたい方法ではありません。

典型的なテストは次のようになります。

@Test
   public void testInEJBContainer() throws Exception {

       File ejbJarFile = new File("target/dum/dum-ejb.jar");

       Map props = new HashMap();
       props.put("org.glassfish.ejb.embedded.glassfish.instance.root",
               "target/classes/instance-root");
       props.put(EJBContainer.MODULES, new File[]{ejbJarFile});
       EJBContainer container = EJBContainer.createEJBContainer(props);

       CompanyService = (CompanyService)
container.getContext().lookup("java:global/dum/CompanyServiceImpl");
       log.info("result of findAll() " + service.findAll(false));
   }

CompanyService インターフェイスと返された Company Entity クラスがクラスパスにない場合、どのようにテストを実行できますか?

dum-ejb.jar がクラスパス上になく、dum-ejb-client.jar がある場合でも、EclipseLink のウィービングが壊れます。

これはまさに EJBContainer の典型的なユース ケースではないでしょうか。これに対する簡単な解決策があるはずではありませんか?

4

1 に答える 1

0

Maven EarプロジェクトからEJBContainerを実行していたため、クラスローディングの問題が発生しました。

Maven ejbプロジェクト自体から実行すると、そのような問題はなく、EJBContainerは使いやすいです。

于 2011-04-21T05:56:43.013 に答える