2013-10-01 39 views
2

我有场移植的JNDI名称的DataSource

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

一个EJB,并进入

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

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

在此先感谢。

回答

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/

0

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

+0

感谢您的回复。我更详细地审查了这个问题(请参阅我的答案)。 – briarheart

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,你的持久化单元的定义将尝试从现有的情况下查找JDBC数据源的java:comp/env的。

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

我仍在试图找出Tomee如何处理catalina/tomcat context.xml,对此我现在无能为力。