4

この質問は、 glassfish v3 embedded-allを使用したJava EE 6に関するものです。

EJBContainer を使用してステートレス EJB をテストする単体テストがあります。問題は、JNDI を使用して EJB (リモート) を検索できないことです。

setup() {

  ctx = EJBContainer.createEJBContainer().getContext();

}

...

test() {

BookService bookService = (BookService)ctx.lookup("java:global/BookServiceEJB!com.something.service.BookService");

...

}

@Stateless
public class BookServiceEJB implements BookService {
...
}

@Remote
public interface BookService {
...
}

例外を与えます:

javax.naming.NamingException: Lookup failed for 'java:global/BookServiceEJB!com.something.service.BookService' in SerialContext  [Root exception is javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found]

...

caused by: javax.naming.NameNotFoundException: BookServiceEJB!com.something.service.BookService not found

いくつかの JNDI リソース パスを試しました。

例えば

java:global/BookServiceEJB

java:global/BookService

平:

java:global/BookShelf-1.0-SNAPSHOT/BookServiceEJB

等...

何も動作しません

xml 展開ファイルは構成されておらず、META-INF のみですpersistence.xml

テストはmaven Surefireを使用しています:

mvn clean test

どんな助けでも大歓迎です!

: Glassfish サーバーへの完全なデプロイは機能します (appclient と@EJBインジェクションを使用)

4

3 に答える 3

6

多くの検索の後、私のために働く解決策を見つけました...

プロパティEJBContainer.MODULES、およびモジュールクラスがある場所(mavenを使用している場合は「target / classes」)を使用してEJBContainerを構成する必要があります。

例えば

...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...

EJBがJPAを使用する場合、埋め込みコンテナでデータソースを定義できないという別の問題があるため、デフォルトのds:'jdbc /__default'を使用する必要があります。

たとえば、私のpersistence.xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="1.0">

    <persistence-unit name="bookshelf" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.blah.domain.Book</class>
        <jta-data-source>jdbc/__default</jta-data-source>
        <properties>
            <property name="eclipselink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>

</persistence> 

あるDS(jdbc / __ default)を使用するように組み込みコンテナーテストを構成し、別のDS(jdbc / booksDSなど)を使用するようにアプリを構成する方法がわかりません。

参照http ://www.mentby.com/glassfish/embedded-testing-woes.html

参照: http: //forums.java.net/jive/thread.jspa?messageID = 395759

正直なところ、春のようなソリューションが非常に単純なのに、なぜ人々がJavaEEに悩まされているのかわかりません...

それは非常に苛立たしく、多くの時間が無駄になりました...これが役立つことを願っています。

于 2010-10-15T05:04:05.323 に答える
3

NamingExceptionを回避してcontext.lookupを介して Bean をロードできることを確認するために、確認する必要がある項目がいくつかあります。

  1. あなたが豆を持っていることを確認してください。これは当たり前のことのように聞こえるかもしれませんが、テストでサービスのインスタンスを取得できなかった理由を突き止めるために多くの時間を費やしました。その理由は、Statelessアノテーションが欠落していたためです。

  2. @Dzhuが指摘したように、コンテナを作成するときにモジュールを追加します。Mavenクラスの場合はtarget/ classes、mavenテストの場合はtarget/ test-class になります。

  3. SEVERE: EJB6005:No EJB modules foundコンソールのようなメッセージが表示された場合は、何か問題があります。ステートレスのアノテーション付きクラスがないことがわかります

  4. 組み込みのグラスフィッシュ コンソールを見てみましょう! そこには、Bean のルックアップ名が表示されます。形式のメッセージに注意してくださいINFO: EJB5181:Portable JNDI names for EJB YourBean: [java:global/classes/YourBean!bean.package.YourBean, java:global/classes/YourBean]。つまり、名前の競合がない場合に役立つ短い名前を呼び出すcontext.lookup("java:global/classes/YourBean!bean.package.YourBean")か、短い名前で Bean を検索できます。context.lookup("java:global/classes/YourBean")

これが誰かに役立つことを願っています。このヒントがあれば本当に助かりました。

于 2013-11-26T17:17:19.420 に答える
2

組み込みのグラスフィッシュ 3.1 コンテナーの使用に関する小さなチュートリアルを作成しました。また、テスト用に別の persistence.xml が必要であるという問題にも対処しています。また、リモート インターフェイスと Web サービスでコンテナーがクラッシュする問題を修正しました。http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.htmlで確認できます。

于 2011-06-05T11:53:11.677 に答える