Java EE 6-埋め込みコンテナEJBテスト
-
30-09-2019 - |
質問
この質問はそれについてです Java EE 6, 、使用 Glassfish V3埋め込みすべて.
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展開はありません 構成されたファイル、aのみ persistence.xml
Meta-infで。
このテストでは、Maven SureFireを使用しています。
mvn clean test
どんな助けも大歓迎です!
ノート: :Glassfishサーバーへの完全な展開(AppClientを使用して、 @EJB
注入)
解決
多くの検索の後、私のために働く解決策を見つけました...
ejbcontainerをプロパティで構成する必要があります:ejbcontainer.modules、およびモジュールクラスがある場所(maven、 'target/classes'を使用する場合)。
例えば
...
props = new Properties();
props.put(EJBContainer.MODULES, new File("target/classes"));
ec = EJBContainer.createEJBContainer(props);
...
EJBがJPAを使用している場合、埋め込みコンテナ内のデータソースを定義できないという別の問題があるため、デフォルトのDS:「JDBC/__デフォルト」を使用する必要があります。
たとえば、私の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>
1つのDS(JDBC/__デフォルト)を使用するように組み込みコンテナテストを構成する方法を見つけていません。
見る: http://www.mentby.com/glassfish/embedded-testing-woes.html
見る: http://forums.java.net/jive/thread.jspa?messageid=395759
正直に言うと、春のような解決策がはるかに簡単なのに、なぜ人々がJava EEに悩まされているのかわかりません...
それは非常にイライラし、多くの時間を無駄にしてきました...これが役立つことを願っています。
他のヒント
チェックインする必要があるアイテムがいくつかあります。 Context.lookup 避ける namingexception.
豆があることを確認してください。これは明らかなように聞こえるかもしれませんが、私はテストで自分のサービスのインスタンスを取得できなかった理由を理解するために多くの時間を費やしました。その理由は、私が行方不明だったからです ステートレス 注釈。
@dzhuが指摘したように、コンテナを作成するときにモジュールを追加します。メイベンのために クラス そうなるでしょう 目標/クラス, 、メイベンのために テスト そうなるでしょう 目標/テストクラス.
あなたが次のようなメッセージを見つけた場合、何かがおかしい
SEVERE: EJB6005:No EJB modules found
コンソールで。それはあなたにノーがあることを教えてくれます ステートレス 注釈付きクラス埋め込まれたGlassfishコンソールをご覧ください!そこには、豆のルックアップ名が表示されます。形式のメッセージに注意してください
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")
または短い名前でcontext.lookup("java:global/classes/YourBean")
名前の衝突がない場合に役立ちます。
これが誰かを助けることを願っています。このヒントを持っていたことは本当に役に立ちました。
埋め込まれたGlassfish 3.1コンテナの使用に関する小さなチュートリアルを作成しました。また、テストには異なるPersistence.xmlが必要であるための問題に対処しました。また、リモートインターフェイスとウェブサービスでコンテナクラッシュを固定します。でチェックアウトできます http://pschyska.blogspot.com/2011/06/unit-testing-ejb-31-with-netbeans-maven.html