我有一个带字段的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"
,但它对我没有帮助。
提前致谢。
答案 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