所以我们正在将一个用EJB 2.1编写的项目部分地迁移到EJB 3.1。首先,我们选择了1个ejb并将3.1更改合并到其中,而没有触及其他现有的2.1 bean。除了其他EJB 3.1更改之外,我们还将现有EJB -jar.xml的版本更改为version="3.1",因为如果不更改它,EJB 3.1 bean将无法绑定。
但是,在版本更改为3.1之后,无法查找在2.1中编写的EJB bean,例外是:
"javax.naming.NameNotFoundException:
Name "ejb/ejb/gov/michigan/access/business/services/ABTransactionManagedEJBLocalHome"
not found in context "local:"".
是否有可能同时拥有2.1 &3.1组件一起在应用程序中?如果是,我需要做什么配置来支持它?我在网上读了很多资料,也尝试了很多东西,但似乎都不起作用。
第一个问题的答案是明确的:是的,您可以在一个应用程序中使用它们。我们自己有一个应用程序,它已经有几年的历史了,仍然有一些部分是用J2EE编写的,还有一些新的部分是用Java EE编写的,都在一个EAR文件中。
关于你的异常,我不能确切地说它是什么,但它看起来像是使用了错误的上下文进行查找。遗憾的是,这是特定于容器的,因此查找有关如何进行查找的特定于容器的文档可能会有所帮助。对于JBOss,您可以在这里找到一个示例:
通过"2.1组件",我假设您的意思是EJB公开了一个主/组件接口,通过"3.1组件",我假设您的意思是EJB公开了一个业务接口。(注意EJB模块是版本化的,但是EJB组件不是。EJB可以公开主/组件接口和业务接口,它们可以通过注释或XML公开。
在WebSphere Application Server中,"local:"上下文是EJB 2的内部细节。在EJB 3.0(及以后的版本)模块中,EJB容器不会绑定到此上下文。但是,从v7.0开始,所有模块版本的EJB容器都绑定到"ejblocal:"上下文。请参阅SystemOut.log中的CNTR0167I消息,以确定正确的(非内部的)JNDI查找名称。