2

我有一个带字段的 EJB

@Resource(lookup = "jdbc/sampleDS")
private DataSource ds;

和带有条目的persistence.xml

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

我想让应用程序在不同的 Java EE 服务器之间轻松移植。但在 JBoss JNDI 中,名称必须以 java:/ 或 java:jboss/ 开头。同时 Glassfish 不喜欢符号 ':'。如何实现可移植性?我试图use-java-context="false"为数据源 instandalone.xml 设置属性,但这对我没有帮助。

提前致谢。

4

2 回答 2

1

关键persistence.xml是不是为了定义你的资源。它旨在引用要用于您的 JTA 实体管理器的资源,即您的持久性单元。是的,您可以动态定义资源,而不是引用预定义的资源,但这会将其放置在特定于您正在使用的容器的上下文中。

persistence.xml用于查找预定义的 JNDI 资源时,您将使用以下语法:

  <persistence-unit name="mydb" transaction-type="JTA">
    <jta-data-source>jdbc/mydb</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
  </persistence-unit>

就像@Resource,持久化单元的定义将尝试从 java:comp/env 中的现有上下文中查找 JDBC 数据源。

请注意,为确保这些资源可用,它们应与resource-ref您的web.xml. 这会将它们从全局上下文或应用程序上下文移动到java:comp/env,为其提供标准的 JNDI 名称。例如,在 Tomee 的情况下,将其放在 resources.xml 中使其对您的持久性单元和@Resource标签可用,但在 .xml 中则不可用java:comp/env

我仍在试图弄清楚 Tomee 如何处理 catalina/tomcat context.xml,对此我现在一无所知。

于 2017-07-22T20:16:45.910 回答
0

看来我检查的问题不够充分。由于某种原因,我不能使用注射

@Resource(lookup = "jdbc/sampleDS")

我必须手动查找数据源:

Context ctx = new InitialContext();
dataSource = (DataSource) ctx.lookup("jdbc/sampleDS");

在这种情况下,我可以使用具有属性use-java-context="true"和 JNDI 名称的数据源java:/...java:jboss/.... 前缀java:/java:jboss/持久性单元也不需要。

于 2013-10-08T10:04:50.490 回答