我想编写一个有 2 个 EJB 的应用程序。此应用程序可以在 OpenEJB 和 WebLogic 10.3 中运行。两个 EJB 都是 EJB 3.0。
我知道如何在 OpenEJB 和 WebLogic 中实现,但问题是我想使用相同的代码部署到这两个环境。我认为问题在于如何进行 JNDI 查找,因为 WebLogic 的 Context.INITIAL_CONTEXT_FACTORY 是 weblogic.jndi.WLInitialContextFactory 而 OpenEJB 不是。
当前的想法是第一个 EJB 使用服务定位器来查找第二个 EJB,并且服务定位器将在 2 个环境中读取不同的 INI。还有其他建议吗?有没有一个解决方案我可以只使用注释,不需要使用外部 INI 文件。
这 2 个 EJB 存在于一个容器中,但将来有可能将一个移到另一个容器中。
2011/10/06 更新
根据大卫的建议,我放了一些零钱。该代码是 POJO,而不是 JUnit 代码。它不使用 @LocalClient 和 initialContext.bind("inject", this); (我把 2 代码放在我的 JUnit 代码中)
把resources\META-INF\application-client.xml(只包含)
把资源\jndi.properties
jdbc/OrderDB = new://Resource?type=DataSource jdbc/OrderDB.JdbcDriver = oracle.jdbc.OracleDriver jdbc/OrderDB.JdbcUrl = jdbc:oracle:thin:@*.*.*.*:1521:test jdbc/OrderDB.JtaManaged = false jdbc/OrderDB.UserName = test jdbc/OrderDB.Password = test
查找代码
InitialContext ctx= new InitialContext(); ctx.lookup("jdbc/" + name);
以下是日志,OpenEJB 为数据库创建 JNDI。我也是用Eclipse调试模式查看“ctx”的内容,在MyProps中找到“jdbc/OrderDB”
INFO - Configuring Service(id=jdbc/OrderDB, type=Resource, provider-id=Default JDBC Database)
但最后我仍然无法查找它。我也尝试使用 ctx.lookup(name), ctx.lookup("java:comp/env/jdbc/" + name) 结果是一样的。
javax.naming.NameNotFoundException: Name "jdbc/OrderDB" not found.
2011/10/12 更新
根据 David 的评论,在 Java EE6 之前,我认为唯一的解决方案是使用服务定位器和一些配置在 WebLogic 和 OpenEJB 之间使用不同的 JNDI。以下是测试结果。
DB: WebLogic:OrderDB,OpenEJB:openejb:Resource/jdbc/OrderDB
事务管理器: WebLogic:javax.transaction.TransactionManager,OpenEJB:java:comp/TransactionManager
EJB:他们都只是查找没有任何前缀的 EJB 名称