NetBeans跨项目EJB注入及CDI使用问题:如何仅通过本地接口实现跨项目调用
解决跨项目EJB/CDI调用的编译依赖问题
这个问题其实很好解决——核心思路是把共享的接口抽出来放到一个独立的中间项目里,彻底解开两个项目之间的编译依赖。我给你一步步说怎么做:
1. 新建一个独立的API类库项目
在NetBeans里创建一个普通的Java类库项目(比如命名为shared-ejb-api),专门用来存放两个项目之间需要共享的接口:
- 把
calledon项目里的EJB接口(比如你提到的CalledOn对应的接口)迁移到这个项目中 - 给接口加上
@Local注解(如果是本地容器内调用,这是最适合的场景),确保接口是public访问权限,示例代码:import javax.ejb.Local; @Local public interface CalledOnInterface { // 定义你需要调用的方法,比如 String doSomething(); }
2. 改造calledon项目
- 在NetBeans中右键点击
calledon项目 → 「库」→ 「添加项目」,选择刚才创建的shared-ejb-api项目,把它作为依赖添加进来 - 修改你的
CalledOnEJB类,让它实现这个共享接口,保持原有的EJB注解(比如@Stateless)不变:import javax.ejb.Stateless; import com.yourpackage.shared.api.CalledOnInterface; @Stateless public class CalledOn implements CalledOnInterface { @Override public String doSomething() { return "Called from CalledOn bean!"; } }
3. 改造caller项目
- 同样给
caller项目添加shared-ejb-api项目作为依赖(步骤和上面一样) - 在
caller项目中,通过共享接口来注入并调用EJB,不需要直接引用CalledOn实现类:import javax.ejb.EJB; import com.yourpackage.shared.api.CalledOnInterface; public class CallerService { @EJB private CalledOnInterface calledOnBean; public void invokeCalledOn() { String result = calledOnBean.doSomething(); System.out.println(result); } }
4. 部署与运行注意事项
- 确保
shared-ejb-api、calledon、caller三个项目都部署到同一个Java EE应用服务器(比如GlassFish、WildFly),因为本地EJB调用要求所有组件在同一个容器实例内 - 编译
caller项目时,只需要shared-ejb-api的代码存在即可,完全不需要先编译calledon项目——只有在部署运行时,服务器才会把calledon的实现和caller的调用关联起来
这种方式的好处是彻底解耦了两个业务项目的编译依赖,同时符合Java EE中EJB调用的规范,是企业级项目中常用的解耦方案。
内容的提问来源于stack exchange,提问作者JanNilsson
相关产品推荐
相关产品推荐

