我们希望将旧应用程序从 Glassfish 迁移到 TomEE。我们遇到了一个关于JNDI的问题。
当我运行 Glassfish 服务器的 cmd 时asadmin list-jndi-entries
我得到一些 JNDI 条目:
java:global: com.sun.enterprise.naming.impl.TransientContext
UserTransaction: com.sun.enterprise.transaction.TransactionNamingProxy$UserTransactionProxy
com: com.sun.enterprise.naming.impl.TransientContext
OURAPPSERVER-Q2: com.ourcompany.product.OurAppServer
com.sun.enterprise.container.common.spi.util.InjectionManager: com.sun.enterprise.container.common.impl.util.InjectionManagerImpl
ejb: com.sun.enterprise.naming.impl.TransientContext
jdbc: com.sun.enterprise.naming.impl.TransientContext
AppServer: com.sun.enterprise.naming.impl.TransientContext
如您所见,有 AppServer JNDI 条目。此条目是从我们的代码手动绑定的。
try {
InitialContext context = new InitialContext();
context.rebind("AppServer/facede", this);
} catch (NamingException e) {
e.printStackTrace();
logger.severe("Unable to register the service facade bean, "
+ "JPOS will not be able to access services");
}
此代码在 TomEE 中不起作用。我收到一些错误,例如:
javax.naming.NameNotFoundException: Name [AppServer/facede] is not bound in this Context. Unable to find [AppServer].
at org.apache.naming.NamingContext.bind(NamingContext.java:899)
at org.apache.naming.NamingContext.rebind(NamingContext.java:225)
容器似乎无法在应用服务器上找到基于上下文的上下文。
我不是JNDI的大师。然后我检查了一些文件。java:comp/env/是基本的命名空间。"jdbc"代表DBCTM DataSource引用,"jms"代表JMS连接工厂,"mail"代表JavaMail连接工厂,"url"代表URL连接工厂。
我们不想对旧的应用程序代码进行太多更改。它没有使用Glassfish的任何特殊功能。我想知道如何以正确的方式定义 JNDI。
有没有人可以告诉我为什么Glassfish可以使用AppServer作为命名空间,而TomEE不能。
Tomcat(然后是TomEE)并不是为了在运行时改变JNDI而设计的。简单地说,最好的是不要使用这种模式,而是使用上下文资源。注入你想要的资源,这就是你改变的资源而不是JNDI(看起来影响更大)