我们目前有一个由多个应用程序和基础库组成的项目。 应用程序和基础库都包含无状态EJB,每个应用程序可能引入一个从基础库EJB继承的EJB,从而实现相同的接口。
一个简短的例子:
在基础库中我们有:
@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
}
如果我现在在应用程序中有另一个需要引用SpecificUserServiceBean
的EJB,我会@EJB ISpecificUserService userService;
。
但是,如果基础库中有EJB,它将包含@EJB IUserService userService;
,这就是问题所在:
我们需要将应用程序中的特定服务注入基础库EJB中。但是,有两个EJB为同一本地接口注册,这意味着容器可能返回基本EJB或特定EJB。
您可以说“不要将基础库jar作为模块添加到application.xml”但是现在不可能,因为它包含需要部署的其他EJB。我们可以将EJB重写为不同的jar,但由于几乎每个EJB都可能被覆盖,因此根据应用程序的不同,我们最终会得到每个EJB的jar。
因此,如果存在特定的覆盖,我想从依赖注入容器中排除或删除基本EJB。因为我知道在部署时,我也可以使用配置文件告诉容器不要加载特定的EJB类。
我可能会添加一个后来修改容器的服务,但那将是我最后的选择。
您对我们的工作有什么想法吗?
提前致谢。
顺便说一句,我们正在使用EJB 3.0开发JBoss 4.2.3。
答案 0 :(得分:1)
问题是你的应用程序部分在基础库中连接是不好的,因为你无法覆盖这种连线。
因此,解决方案是从基础库中的@Stateless @Local( IUserService.class )
中删除UserServiceBean
;基本库只提供bean的默认实现,但它不能连接它们。
在您的应用中,您需要以下代码:
@Stateless
@Local( IUserService.class )
public AppUserServiceBean extends UserServiceBean {}
创建布线。将所有这些bean移动到一个特殊的包中,您可以将其复制到每个应用程序中,以便获得所有内容的默认连接。