我们目前有一个由多个应用程序和一个基础库组成的项目。 应用程序和基础库都包含无状态 EJB,每个应用程序都可能引入一个继承自基础库 EJB 的 EJB,从而实现相同的接口(interface)。
一个简短的例子:
在基础库中我们有:
@Stateless
@Local( IUserService.class )
public UserServiceBean implements IUserService {
public void login(String user, String password) {...}
}
在应用程序中,我们需要重写login(...)
,因此我们有:
@Stateless
@Local( { ISpecificUserService.class, IUserService.class } )
public SpecificUserServiceBean extends UserServiceBean implements ISpecificUserService {
public void login(String user, String password) { ... } //override
}
如果应用程序中现在有另一个 EJB 需要引用 SpecificUserServiceBean
,我会执行 @EJB ISpecificUserService userService;
。
但是,如果基础库中有一个 EJB,它将包含 @EJB IUserService userService;
,问题如下:
我们需要将应用程序中的特定服务注入(inject)基础库EJB中。但是,有两个 EJB 注册了同一个本地接口(interface),这意味着容器可能返回基本 EJB 或特定 EJB。
您可以说“不要将基础库 jar 添加为 application.xml 中的模块”,但这现在不可能,因为它包含需要部署的其他 EJB。我们可以将要覆盖的 EJB 移至不同的 jar,但由于几乎每个 EJB 都可能被覆盖(具体取决于应用程序),因此我们最终会为每个 EJB 提供一个 jar。
因此,如果存在特定的覆盖,我想从依赖项注入(inject)容器中排除或删除基本 EJB。因为我知道在部署时,我还可以使用配置文件来告诉容器不要加载特定的 EJB 类。
我可能会添加一个服务来修改容器,但这将是我最后的手段。
您对我们可以做什么有什么想法吗?
提前致谢。
顺便说一句,我们正在开发带有 EJB 3.0 的 JBoss 4.2.3。
最佳答案
问题是您在基础库中部分连接了您的应用程序,这很糟糕,因为您无法覆盖此连接。
因此,解决方案是从基础库中的 UserServiceBean
中删除 @Stateless @Local( IUserService.class )
;基本库只提供 bean 的默认实现,但不能连接它们。
在您的应用中,您需要以下代码:
@Stateless
@Local( IUserService.class )
public AppUserServiceBean extends UserServiceBean {}
创建接线。将所有这些 bean 移至一个特殊的包中,您可以将其复制到每个应用程序中,以便获得所有内容的默认连接。
关于java - 从 JBoss 中的依赖注入(inject)中排除/删除服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743775/