私は、Jetty、OpenEJB、およびWebAppsを使ってSeleniumテストの開発と実行をプログラム的にセットアップしようとしています。この記事でよく似た何か:http://tomee.apache.org/functional-testing-with-openejb,-jetty-and-selenium.html。TomEE(またはOpenEJB)、Jetty、Seleniumでの機能テストのためのCDIの問題
このセットアップは、IDEまたはMavenでSeleniumテストを開始し、同じコードを使用して開発用のサーバーを起動できるため、非常に優れています。
この設定は、EJB 3.0の旧バージョンのJetty(6.2)と未知のEJBコンテナ(MyContainer)を使用して動作していました。今、私はWildfly 10.1.0で動作し、CDI(BeanManager)によるEJBルックアップを実行する新しいプロジェクトで同じことをやっています(またはしようとしています...)。
しかし、CDIを新しいバージョンのJettyとOpenEJBまたはTomEEで正しく動作させるためにいくつかの問題があります。新しいバージョンのフレームワークで、インターネット上の別の例を同じものに見つけることはできません。私は本当にそれをするために桟橋が必要かどうかわかりません。
:初の試み:OpenEJBの4.7.4と私はコードCDI.current().getBeanManager()
結果を実行して桟橋9.4を使用して桟橋(桟橋-JNDIなし)+ OpenEJBの+ tomee.jpa.cdi = falseを
java.lang.IllegalStateException: Unable to access CDI
のpersistence.xml:
<property name="tomee.jpa.cdi" value="false" />
OBSはbeans.xmlファイルは、すべての試みの私のWebアプリケーションのWEB-INFディレクトリにある.:します。
第二の試み:(桟橋-JNDIなし)桟橋+ TomEE + tomee.jpa.cdi = falseをTomEE 7.0.3および桟橋9.4を使用して
、私はCDIだけでTomEEのためのOpenEJBを変更する必要がありすることができますよ依存関係(奇妙なことに、OpenEJBにはCDIがサポートされていると思われます)。私は、サーバーのセットアップの途中で、デバッグしていたときに、このCDIは動作しますが、プログラムは、Webアプリケーションを打ったとき、私が作ったEJBの参照にしようとしているwhemエラーが発生します。
"On a thread without an initialized context nor a classloader mapping a deployed app"
第三の試み:桟橋(
EJBコンテナが起動しますが、見つからないためにJettyサーバーを起動できません。java:comp/env/
。
javax.naming.NameNotFoundException: Name "comp/env" not found
コードを追加:
Configuration.ClassList classlist = Configuration.ClassList.setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration");
第四の試み:桟橋(桟橋-JNDIなし)+ TomEE + tomee.jpa.factory.lazy =真
変更persistence.xmlでプロパティを:
<property name="tomee.jpa.factory.lazy" value="true" />
EJBコンテナが開始され、CDI.current()が存在するが、私はその機知後、いくつかのSQLを実行しようとすると、コード:
@PersistenceContext(unitName="my-pu")
private EntityManager em;
//method
Session session = em.unwrap(Session.class);
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
try (Statement statement = connection.createStatement()) {
statement.executeUpdate(sql);
connection.commit();
}
}
});
Session session = em.unwrap(Session.class);
でシステムが大量に停止しています。その後、エラーの多くは(Unable to build Hibernate SessionFactory
、Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
)表示され、スタックトレースの終わりに:
Caused by: javax.ejb.ConcurrentAccessTimeoutException: No instances available in Stateless Session Bean pool. Waited 30 SECONDS
質問
ので、クラスパスの問題だろうか?古いEJBコンテナからいくつかの依存関係を削除した後に解決されたTomEE CDIには、すでにいくつかの問題がありました。私はすでに、CDIの問題について、原因がcdi-api
の依存関係に関連する間違ったインポートであると読んだ。
このような環境の仕事をするために私の考えとはかなり違った(単純な)考え方がある人は、歓迎します。
コード
Mavenの依存関係のJavaEE APIのいくつかの関連部分:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
Mavenの依存関係CDI API:
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
Mavenの依存関係のOpenEJB 4.7.4:
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core</artifactId>
<version>4.7.4</version>
</dependency>
Mavenの依存TomEE 7.0.3:
<dependency>
<groupId>org.apache.tomee</groupId>
<artifactId>openejb-core</artifactId>
<version>7.0.3</version>
</dependency>
Mavenの依存突堤:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.6.v20170531</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.4.6.v20170531</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-plus</artifactId>
<version>9.4.6.v20170531</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jndi</artifactId>
<version>9.4.6.v20170531</version>
</dependency>
persistence.xmlの
<!-- I uncomment only one of this properties each time -->
<!-- <property name="tomee.jpa.factory.lazy" value="true" />-->
<property name="tomee.jpa.cdi" value="false" />
のServiceLocatorルックアップコード(ServiceLocator.lookup(CrudService.class)
):
@Override
public Object lookup(Class<?> type, Annotation... annotations) throws NamingException {
BeanManager manager = CDI.current().getBeanManager();
Iterator<Bean<?>> beans = manager.getBeans(type, annotations).iterator();
if (!beans.hasNext()) {
throw new NamingException("CDI BeanManager cannot find an instance of requested type " + type.getName());
}
Bean<?> bean = beans.next();
CreationalContext<?> ctx = manager.createCreationalContext(bean);
return manager.getReference(bean, type, ctx);
}
EJBContainerを作成します。
EJBContainer.createEJBContainer(props).getContext(); //nothing special in the props