【问题标题】:Arquillian Injected EntityManager is nullArquillian Injected EntityManager 为空
【发布时间】:2015-11-23 12:34:33
【问题描述】:

使用 Wildfly 10 和 Arquillian,注入 EntityManager 总是返回 NULL。这是为什么呢?

这是我的测试类:

@RunWith(Arquillian.class)
public class XXXDAOTest {


@Deployment
public static JavaArchive createDeployment() {
    return ShrinkWrap.create(JavaArchive.class)
            .addClass(XXXDAO.class)
            .addAsResource("test-ds.xml")
            .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}

@Test
@PersistenceContext
public void testCreateUser(EntityManager em) {
    Assert.assertNotNull("em is NULL", em);

测试失败,因为EntityManagerNULL

test-persistence.xml如下

   <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="xxx-ejb">
        <jta-data-source>jdbc/arquillian</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>
</persistence>

此外,我正在使用test-ds.xml 中声明的数据源

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">
    <persistence-unit name="xxx-ejb">
        <jta-data-source>jdbc/arquillian</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        </properties>
    </persistence-unit>
</persistence>

在我的pom.xmlArquillian 中配置如下:

<dependency>
        <groupId>org.jboss.arquillian.container</groupId>
        <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
        <version>1.0.0.CR8</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.arquillian.container</groupId>
                <artifactId>arquillian-container-spi</artifactId>
            </exclusion>
        </exclusions>
    </dependency> 
    <dependency>
        <groupId>org.jboss.arquillian.extension</groupId>
        <artifactId>arquillian-persistence-integration-tests</artifactId>
        <version>1.0.0.Alpha7</version>
        <scope>test</scope>
    </dependency>

我在某处读到pom.xml 中提供的arquillian-weld-ee-embedded 不支持持久性测试,所以我在下面添加了扩展。我找不到 arquillian 的任何其他配置文件来进行持久性测试。

你有什么提示为什么注入EntityManager不起作用?

【问题讨论】:

  • 如果使用@PersistenceContext 作为字段而不是方法参数,它是否仍然为空?
  • 是的,没有任何区别
  • 因为您使用的是嵌入式焊接,我怀疑您是否得到了一个连接所有东西的完整容器。你最好使用一个完整的容器而不是一个焊接容器。
  • @Jbartmann 你解决了这个问题吗?有小费吗?我有同样的场景:Arquillian + Wildfly 10 + EntityManager 注入
  • 这里也一样,有人解决了吗?

标签: java persistence jboss-arquillian


【解决方案1】:

你必须在test-ds.xml中定义容器上使用的数据源,例如:

<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.jboss.org/ironjacamar/schema
        http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
    <datasource enabled="true" jndi-name="jdbc/arquillian"
            pool-name="ArquillianEmbeddedH2Pool">
            <connection-url>jdbc:h2:mem:arquillian;DB_CLOSE_DELAY=-1</connection-url>
            <driver>h2</driver>
    </datasource>
</datasources>

以下数据源适用于 WildFly,因为数据库 h2 包含在 WildFly 发行版中。

完整示例见https://arquillian.org/guides/testing_java_persistence/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2012-04-29
    • 2013-09-21
    相关资源
    最近更新 更多