我正在尝试使用嵌入式EJB容器测试EJB。在生产中,我依赖于在应用程序服务器中配置的JTA数据源。但是,在测试期间,我想连接到另一个数据库(内存中的Derby)。

问题在于,我看不到如何通过与内存中的derby DB的连接来告诉EJB容器重写在我的生产persistence.xml(在src/main/resources/META-INF中)中定义的JTA数据源。 JTA数据源在persistence.xml文件中定义,如下所示:

<jta-data-source>jdbc/myDS</jta-data-source>

尝试1:使用测试persistence.xml

我尝试创建一个测试persistence.xml文件(在src/test/resources/META-INF中),该文件定义:
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDataBase;create=true;" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="password" />

但是,这没有什么意义,因为当我指定EJB容器以使用被测模块时,
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);

容器仅使用主要的persistence.xml文件而不是我的测试文件。

尝试2:将主类和测试类合并到一个分解的模块中

我看到使该方法起作用的唯一方法是使用here描述的方法-将被测模块的类复制到单独的位置(例如target/ejb-testing-classes),然后复制测试persistence.xml文件放在顶部,然后将这个新位置指定到EJB容器:
Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
ec = EJBContainer.createEJBContainer(properties);

但这似乎很笨拙。如果我尝试在容器中部署预包装的模块(即依赖项),将来也可能会出现问题,因为在合并之前我需要将jar分解。

我的愿望:数据源覆盖EJB容器的属性

我以为可能会有其他属性可以传递到EJB容器中,但是到目前为止,我只能找到适合openEJBwebsphere的属性。我正在使用嵌入式Glassfish提供我的嵌入式EJB容器,因为它是目标平台。 (我现在找到了glassfish属性-参见下面的更新#1)

当然,每个尝试使用嵌入式EJB容器和与生产DB的数据源不同的数据源测试EJB的人都遇到了这个问题。即使是this guy,在这一点上也放弃了,使用了默认的嵌入式数据库,这对我来说不是一个选择。

任何帮助将非常感激。

更新1:我找到了Glassfish EJB容器接受的list of properties,乍一看,我可以使用以下属性
org.glassfish.ejb.embedded.glassfish.configuration.file

在domain.xml中定义数据源并将容器指向它。但是,根据source code,除非也设置了installation.root属性,否则将忽略此属性-这意味着仅需要预先安装的glassfish即可运行我的测试。这将令人无法接受地降低了我的Maven项目的可移植性。 :(

更新2:我已经为这个问题创建了JIRA issue,并建议为glassfish EJB容器引入属性,以允许配置JTA数据源。

最佳答案

嵌入式Glassfish无法完成。

正如我在Update 1中指出的那样,为了使用数据源配置嵌入式EJB容器,您必须:

  • 使用新的数据源
  • 配置domain.xml文件
  • 配置嵌入式EJB容器以使用现有的Glassfish AS安装
  • 配置嵌入式EJB容器以使用步骤1中的domain.xml文件。

  • 因此(感谢步骤2),再见,可移植性。但这是我必须使用的“解决方案”,直到Glassfish开发人员通过属性设置我的配置数据源的请求为止(请参阅问题中的JIRA链接)。

    关于jakarta-ee - 如何为嵌入式EJB容器定义测试数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14748280/

    10-11 22:25
    查看更多