4

少し奇妙な問題があります。現在、Embedded GlassFish (3.1.2.2) と共に Arquillian (1.1.0.Final) を使用しています。次のガイドを使用して、小さなテスト プロジェクトをセットアップしました。統合された Derby データベースでは、すべてが正常に機能しました。私の実際のアプリケーションは PostgreSQL をデータベースとして使用するため、GlassFish リソースを次のように構成しました。

    <!-- See http://jdbc.postgresql.org/documentation/91/ds-cpds.html -->
    <jdbc-connection-pool name="MyPostgresqlPool"
                          res-type="javax.sql.DataSource"
                          datasource-classname="org.postgresql.ds.PGSimpleDataSource"
                          is-isolation-level-guaranteed="false">

        <property name="user" value="..." />
        <property name="databaseName" value="..." />
        <property name="password" value="..." />
        <property name="serverName" value="..." />
        <property name="portNumber" value="..." />

    </jdbc-connection-pool>

そして、上記のガイドで説明されているように、永続化コンテキストとユーザー トランザクションにアクセスします。

@RunWith(Arquillian.class)
public class AddressModuleTest extends BaseTest {
    @PersistenceContext
    protected EntityManager em;

    @Inject
    protected UserTransaction utx;

    @Before
    public void setUp() throws Exception {
        utx.begin();
        em.joinTransaction();
    }

    @After
    public void tearDown() throws Exception {
        utx.rollback();
    }

 [ ... snip ...]
}

テスト クラス (AddressModuleTest、「BaseTest」には Arquillian の @Deployment アノテーションが付けられた静的メソッドがあることに注意してください) を実行すると、すべて問題なく、PostgreSQL データベースからデータを読み取ることができます。

残念ながら、2 番目のテスト クラスを作成しても機能しません。

@RunWith(Arquillian.class)
public class CommunicationModuleTest extends BaseTest {
    @PersistenceContext
    protected EntityManager em;

    @Inject
    protected UserTransaction utx;

    @Before
    public void setUp() throws Exception {
        utx.begin();
        em.joinTransaction();
    }

    @After
    public void tearDown() throws Exception {
        utx.rollback();
    }

    [ ... snip ... ]
}

Maven(それぞれ確実)は私に次のエラーを与えます:

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.758 sec <<< FAILURE!
loadMessageDAO(package.CommunicationModuleTest)  Time elapsed: 0.027 sec  <<< ERROR!
java.lang.RuntimeException: Could not inject members
    at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:135)
    at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.enrich(CDIInjectionEnricher.java:78)
    at org.jboss.arquillian.test.impl.TestInstanceEnricher.enrich(TestInstanceEnricher.java:52)
    at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ ... snip ... ]

.. 次のルート例外があります。

Caused by: org.jboss.weld.exceptions.IllegalArgumentException: WELD-001324 Argument bean must not be null
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:678)
    at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:136)
    at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:686)
    at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:695)
    at org.jboss.weld.manager.SimpleInjectionTarget$1.proceed(SimpleInjectionTarget.java:106)
    at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:134)
    at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
    at org.jboss.weld.manager.SimpleInjectionTarget.inject(SimpleInjectionTarget.java:102)
    at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectNonContextualInstance(CDIInjectionEnricher.java:145)
    at org.jboss.arquillian.testenricher.cdi.CDIInjectionEnricher.injectClass(CDIInjectionEnricher.java:125)
    ... 79 more

私はガイドに戻り、彼らのコードで私の問題を再現しようとしましたが、成功しませんでした (つまり、彼らは私の問題の影響を受けていません)。したがって、UserTransaction の処理が間違っているか、PostgreSQL の構成に問題があると思います。つまり、さまざまなデータソースを試しました

  • org.postgresql.ds.PGSimpleDataSource
  • org.postgresql.ds.PGPoolingDataSource

同様に成功しませんでしたjavax.xa.XADataSourceorg.postgresql.xa.PGXADataSource

誰かが何が悪いのか手がかりを持っていますか? 私は、トランザクション管理だけでなく、さまざまなデータソースについても (非常に) 経験が浅いことを認めなければなりません。


アップデート

問題は MySQL (MariaDB) でも発生するため、PostgreSQL とは無関係のようです。スタックトレースは同じなので、問題はトランザクション管理にあると思います..


よろしくお願いいたします。ご協力いただきありがとうございます。

愚かな羊

4

3 に答える 3

8

このバグは ARQ-1071 によって 1.0.4.Final に導入され、現在のバージョン (1.1.1.Final) に残っています。その理由は、すべての ThreadLocal オカレンスが InheritableThreadLocal に置き換えられ、@Timeout の使用に関する NPE が修正されたためです。

提案された修正は、次のプル リクエストで行われたように、InheritableThreadLocal を 1 つだけ ThreadLocal に戻すことで構成されます: https://github.com/arquillian/arquillian-core/pull/53

次の 1.1.2 でリリースされるイシューに投票してください。最終バージョン: https://issues.jboss.org/browse/ARQ-1458

于 2013-09-11T11:22:13.767 に答える
2

この問題を解決するためのコミットは、その後のバージョンで元に戻され、最終的に解決された1.0.3.Finalバージョンまでありませんでした。1.1.4.Final

<dependency>
    <groupId>org.jboss.arquillian</groupId>
    <artifactId>arquillian-bom</artifactId>
    <version>1.1.4.Final</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
于 2014-04-27T20:32:29.940 に答える