8

有人知道是否可以在 Java EE 应用程序中用 EJB3 bean 迭代地替换 EJB2.1 bean?

也就是说:一次从代码中删除一个 2.1 bean 并添加相应的 EJB3 bean,该 bean 实现相同的行为而无需触及其余代码(+ 能够通过新 EJB3 中的注释注入遗留 EJB)。

我不是 EJB 规范方面的专家(而且我只有 EJB3 方面的经验),但对我来说,EJB 是一个简单的组件,具有由应用服务器管理的给定业务接口。AFAIK EJB3 极大地简化了组件的编写方式(没有人工接口),并且由于注释,大多数时候 xml 描述符可以省略,但基本内容是相同的。所以这似乎是合理的,它可以工作。

EJB2.1 和 EJB3 之间有什么不兼容的地方吗?

问题的核心是迁移 EJB2.1 --> EJB3 是否需要停止世界/完全重写操作,或者可以在向遗留应用程序添加新功能和修复错误的同时做到这一点(所以会有混合EJB2.1 和 EJB3 在运行应用程序中的一段时间)。

编辑:

  • 我只对会话 bean 感兴趣。
  • 我很好奇查找是否(以及如何)起作用。AFAIK EJB2.1 需要称为 home 接口的东西来获取对不同 EJB 的引用,但 EJB3 没有 home 接口......
4

3 回答 3

15

EJB 2.1 和 EJB 3 bean 共存

EJB2 和 EJB3 bean 可以共存于一个企业应用程序 (.ear) 中,但不能驻留在同一个 ejb jar 文件(模块)中。因此,EJB3 bean 必须驻留在与 EJB2 bean 不同的 jar 中。

从 EJB 2.1 调用 EJB 3

EJB3 bean 没有主接口,而 EJB 2.1 需要它。为了使 EJB3 bean 能够从 EJB2 访问,您需要向 EJB3 bean 添加本地 home 接口(如果需要远程调用,则为远程 home)。

创建主界面:

public interface SystemTimeLocalHome extends EJBLocalHome {  
  SystemTimeLocal create() throws CreateException;  
}  

为 EJB3 bean 添加 home 接口:

@Stateless  
@Local(TimeServiceLocal.class)  
@LocalHome(TimeServiceLocalHome.class)  
public class TimeServiceBean implements TimeServiceLocal {  
   public long getCurrentTimeMillis() {  
      return System.currentTimeMillis();  
   }  
}  

在 EJB2 bean 内部,调用 EJB3 bean 的代码只是遵循 EJB2 规范:查找引用,调用 home 接口创建本地接口,然后调用本地接口上的方法。

Context ctx = new InitialContext();  
TimeServiceLocalHome home = (TimeServiceLocalHome)ctx.lookup("java:comp/env/" + ejbRefName);  
TimeServiceLocal timeService = home.create();  
timeService.getCurrentTimeMillis();  

从 EJB 3 调用 EJB 2.1

依赖注入用于将 EJB 2.1 组件引用注入 EJB3 bean。与注入 EJB3 bean 的不同之处在于它是被注入的 EJB2 的主接口。create()在注入的 EJB 主接口上调用方法来实例化 bean 类。

@EJB BankingServiceHome bsHome;

BankingService bs = bsHome.create();
bs.getBalance(...);
于 2014-08-22T05:58:29.583 回答
3

迁移是可能的,尽管并非没有问题。

首先将描述符升级到 Java EE 5 模式。这通常是服务器用来确定是否需要扫描注释的标志。

一旦升级了描述符(但其他方面未更改),您就可以开始将会话和消息驱动 Bean 迁移到 Java EE 5 bean 中。转换 bean 时,如果需要,还可以将其从部署描述符中删除。

在完成所有其他 bean 之后,您可以开始删除实体 bean 并将持久性转换为 JPA 实体类。这是练习的重要部分。

于 2011-05-18T23:54:16.973 回答
0

你当然可以。看看这里的开头: http: //www.coderanch.com/t/321218/EJB-JEE/java/EJB-call-EJB

于 2011-05-19T12:52:59.500 回答