Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 如何为嵌入式EJB容器定义测试数据源_Jakarta Ee_Jpa_Glassfish_Ejb_Maven Glassfish Plugin - Fatal编程技术网

Jakarta ee 如何为嵌入式EJB容器定义测试数据源

Jakarta ee 如何为嵌入式EJB容器定义测试数据源,jakarta-ee,jpa,glassfish,ejb,maven-glassfish-plugin,Jakarta Ee,Jpa,Glassfish,Ejb,Maven Glassfish Plugin,我正在尝试使用嵌入式EJB容器测试我的EJB。在生产中,我依赖于在应用服务器中配置的JTA数据源。但是,在测试期间,我希望连接到另一个DB(内存中的Derby) 问题是,我看不到如何告诉EJB容器使用与内存中derby DB的连接来覆盖在production persistence.xml(在src/main/resources/META-INF中)中定义的JTA数据源。JTA数据源在persistence.xml文件中定义如下: <jta-data-source>jdbc/myDS

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

问题是,我看不到如何告诉EJB容器使用与内存中derby DB的连接来覆盖在production persistence.xml(在src/main/resources/META-INF中)中定义的JTA数据源。JTA数据源在persistence.xml文件中定义如下:

<jta-data-source>jdbc/myDS</jta-data-source>
容器只使用主persistence.xml文件,而不是我的测试文件

尝试2:将主类和测试类合并到单个分解模块中 我能看到的使此方法起作用的唯一方法是使用所描述的方法—将被测模块的类复制到一个单独的位置(例如目标/ejb测试类),然后将test 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容器中,但到目前为止,我只能找到适合或的属性。我使用嵌入式Glassfish来提供我的嵌入式EJB容器,因为它是目标平台。(我现在找到了glassfish属性-请参阅下面的更新#1)

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

任何帮助都将不胜感激

更新1:我找到了Glassfish EJB容器接受的属性,起初似乎可以使用以下属性

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


更新2:我已经为这个问题创建了一个解决方案,并建议为glassfish EJB容器引入属性,该容器允许配置JTA数据源。

对于我的东西,如果不直接使用嵌入式容器,而是使用Arquillian项目,它的效果非常好elper我可以告诉你通过persistence.xml(以及其他替代品)测试

这显示了一个非常简短的示例:

嗯,,
Timo不能用嵌入的Glassfish完成

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

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

  • 所以(感谢第2步)再见,可移植性。但这是我必须遵循的“解决方案”,直到Glassfish开发人员满足我通过属性配置数据源的请求(请参见问题中的JIRA链接)谢谢你,但是我现在正试着避开Arquillian——我已经在框架里找到了我的眼球,不过也许有一天我会考虑的。花一个星期来解决这个问题。
    Map properties = new HashMap();
    properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
    ec = EJBContainer.createEJBContainer(properties);
    
    Map properties = new HashMap();
    properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
    ec = EJBContainer.createEJBContainer(properties);
    
    org.glassfish.ejb.embedded.glassfish.configuration.file