DataSource的可移植JNDI名称

时间:2013-10-01 21:53:28

标签: java java-ee jboss glassfish

我有一个带字段的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不喜欢符号':'。如何实现可移植性?我试图为数据源instandalone.xml设置属性use-java-context="false",但它对我没有帮助。

提前致谢。

3 个答案:

答案 0 :(得分: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标记,但不在java:comp/env中。

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

答案 1 :(得分: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/

答案 2 :(得分:-1)

我从未面对过这样的需求,所以无法给出直接的答案。 也许我似乎很明显,但我认为你应该搜索一些Java EE接口以编程方式组成jndi名称。如果存在 - 供应商必须根据其专有的jndi名称语法实现它。 我不确定它是否相关但请查看此接口及其层次结构: http://docs.oracle.com/javase/7/docs/api/javax/naming/Name.html