java - 从 JBoss 中的依赖注入(inject)中排除/删除服务

标签 java jboss dependency-injection

我们目前有一个由多个应用程序和一个基础库组成的项目。 应用程序和基础库都包含无状态 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/

相关文章:

c# - .Net Web Api 2.2 端点中的依赖注入(inject)不可用

java - 如何将此 MySQL 查询转换为 Hibernate 查询

java - 创建jar时选择主类

eclipse - 如何更改 JBoss 错误消息的语言?

java - MySQL 驱动程序 JBoss AS 7 的 ClassNotFoundException

c# - 多次创建 ASP.NET Core 单例服务

java - 泽西客户端 : Array of Strings as param

java - 任何人都可以为我提供一个基于引用的链表的示例吗?

java - JBoss7 是否允许 Hibernate 3 xml 配置?

java - @Autowired 对象中的 Spring 空指针异常