jakarta-ee - EJB2 和 EJB3 可以共存于一个应用程序中吗?

标签 jakarta-ee ejb-3.0 ejb-2.x

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

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

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

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

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

编辑:

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

    EJB 2.1 和 EJB 3 bean 共存

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

    从 EJB 2.1 调用 EJB 3

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

    创建主界面:

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

    为 EJB3 bean 添加 home 接口(interface):
    @Stateless  
    @Local(TimeServiceLocal.class)  
    @LocalHome(TimeServiceLocalHome.class)  
    public class TimeServiceBean implements TimeServiceLocal {  
       public long getCurrentTimeMillis() {  
          return System.currentTimeMillis();  
       }  
    }  
    

    在 EJB2 bean 内部,调用 EJB3 bean 的代码只是遵循 EJB2 规范:查找引用,调用 home 接口(interface)创建本地接口(interface),然后调用本地接口(interface)上的方法。
    Context ctx = new InitialContext();  
    TimeServiceLocalHome home = (TimeServiceLocalHome)ctx.lookup("java:comp/env/" + ejbRefName);  
    TimeServiceLocal timeService = home.create();  
    timeService.getCurrentTimeMillis();  
    

    从 EJB 3 调用 EJB 2.1

    依赖注入(inject)用于将 EJB 2.1 组件引用注入(inject) EJB3 bean。与注入(inject) EJB3 bean 的不同之处在于它是被注入(inject)的 EJB2 的主接口(interface)。调用 create()注入(inject) EJB 主接口(interface)上的方法来实例化 bean 类。
    @EJB BankingServiceHome bsHome;
    
    BankingService bs = bsHome.create();
    bs.getBalance(...);
    

    关于jakarta-ee - EJB2 和 EJB3 可以共存于一个应用程序中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6051310/

    相关文章:

    java - 我可以访问非 EE java 上的 JMS 吗?

    java - 为什么不调用 PostConstruct?

    ejb-3.0 - 在 WebLogic 10.3.5 上使用 Arquillian 进行 @EJB 注入(inject)不起作用

    java - 我如何使用通用参数覆盖 EJB 3 session bean 方法 - 如果可能的话?

    java - JPA - JSF - 重新渲染 - Ajax 为什么我必须重新启动服务器才能看到添加了新项目?

    java - EJB 2.0 CMP : exception scenario in multiple remove calls

    jakarta-ee - EJB stub 是否保证远程 EJB 可用于任何客户端?

    java - 使用 CDI 生产者会导致不明确的依赖项异常

    java - Jboss AS 6 - 如何通过 JNDI 查找 EJB

    java - 如何远程运行 mapreduce 作业