【发布时间】:2011-12-29 21:16:06
【问题描述】:
在使用 EJB 方面没有太多经验,我遇到了以下问题,希望你们中的某个人能提供帮助。
假设以下情况:已定义一组@Local bean 以提供对数据库的访问。这些 bean 非常简单,并且部署在 应用服务器 A (Weblogic 10.3.3) 上。我们希望通过 remote 提供对这些 local bean 的访问,并且由于我们已经设置了一个“服务”模块来提供对我们服务的外部访问,我们的想法是创建一个新的@Remote 服务,该服务使用上述local bean(通过@EJB 注入)。这些服务bean也部署在应用服务器A上。例如:
@Local
public interface DatabaseBeanLocal { doStuff(); }
@Stateless(name = "ejb/DatabaseBean", mappedName = "DatabaseBean")
public class DatabaseBean implements DatabaseBeanLocal { doStuff() { ... } ; }
@Remote
public interface ServiceBean { doSomeOtherStuff(); }
@Stateless
public class ServiceBeanImpl implements ServiceBean
{
@EJB(name = "ejb/DatabaseBean", mappedName = "DatabaseBean")
private DatabaseBeanLocal myDatabaseBean;
... methods etc. ...
}
实际使用这些remote bean 的客户端实际上运行在不同的应用服务器上; 应用服务器 B(也是 Weblogic 10.3.3)。当我们从客户端查找ServiceBean bean 时,它工作正常。但是,当我们在其上调用需要访问DatabaseBean 的方法时,调用失败。 Weblogic 服务器说它找不到 DatabaseBean 接口的 bean。
我的问题:这种设置是否可行?换句话说:Weblogic(或另一个容器)是否会将本地 bean 注入远程 bean,以便客户端获取能够在本地 bean 上调用操作的远程 bean 实例(我假设不是,但我在问无论如何要确定)?
如果没有,我想我们别无选择,只能跳过服务层并通过@Remote 直接访问上面的DatabaseBean 示例。
更新 1
在做了一些测试之后,简单地将上面的DatabaseBean 定义为@Remote 而不是@Local “修复”了这个问题。当然,这并不是真正的修复,因为它会远程调用DatabaseBean,这很荒谬,因为它与服务位于同一模块中。我开始怀疑用远程 EJB 包装本地 EJB 根本是不可能的。
更新 2
到目前为止我们发现了什么:
- 到目前为止,我们还无法手动注入本地 EJB,因为我们实际上无法在运行时找到它。
- Weblogic 显然不包括 JNDI 树中的本地 EJB。
- 从部署它的 AS 外部调用
ServiceBean仍然无法正常工作,因为对本地 EJB 的依赖永远不会被解析,或者在客户端解析,这意味着它找不到。
【问题讨论】:
-
你配置了DatabaseBean的EJB(实现)了吗?
-
我更新了代码以包含更多细节。
标签: java ejb-3.0 weblogic-10.x