我可以CDI-1.0或-2.0注入一个无状态EJB实现的多个接口吗?

时间:2017-08-30 21:42:33

标签: java-ee cdi ejb-3.0 ejb-3.2

如下例所示:

public interface CommandLineDieselEngineExhaustManipulatorService{
    // command line services
}
public interface ClientDieselEngineExhaustManipulatorFacade{
    // ui-client services
}


@Stateless
public class DieselEngineExhaustManipulatorImpl  implements CommandLineDieselEngineExhaustManipulatorService, ClientDieselEngineExhausManipulatorFacade {
    // Implementation of both interfaces
}

@Stateless
public class MyCdiManagedClass{

    @Inject 
    private CommandLineDieselEngineExhaustManipulatorService cliService;

    @Inject
    private ClientDieselEngineExhausManipulatorFacade clientFacade;

    // Whatever
}

对于我是否应该支持通过其实现接口可注入的无状态EJB注入普通无状态EJB(没有接口),我不感兴趣。

我尝试使用JEE7(CDI1)但没有成功。我得到的结论是EJB + CDI不支持它。

我想知道是否可以使用JEE8?

我找不到CDI 2.0规范中的任何部分,这似乎给了方向的暗示。如果有人能指出正确的地方,我将非常感激。

这个问题没有回答注射部分,可能已经过时且有趣的链接已经死亡:Can an EJB bean implement multiple interfaces?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以,首先,CDI并不是坏人 - 实际上,从CDI的角度来看,拥有一个带有两个接口的bean,你可以基于这些接口注入两个没有问题的bean。

真正的交易似乎是EJB 。现在,我不确定您运行的是哪个应用程序服务器以及哪个EJB版本(您将问题标记为ejb-3.0但是请讨论Java EE 7,它将是EJB 3.2)。

从EJB 3.1规范,4.9.7会话Bean的业务接口:

  

如果bean没有公开任何其他客户端视图(本地,远程,无接口,2.x远程主页,2.x本地主页,Web服务)并且bean类实现单个接口,则假定该接口成为bean的业务接口。除非通过在bean类或接口上使用Remote注释或通过部署描述符将接口指定为远程业务接口,否则此业务接口将是本地接口。

冗长的简短 - EJB 3.1不支持多个接口。 话虽这么说,有些服务器可能会支持它吗?

然而,转到EJB 3.2,再次参见章节4.9.7会话Bean的业务接口:

  

如果bean类使用Local注释    注释,或者如果bean类没有使用Local注释    也不是远程注释,所有实现的接口(不包括nterf   上面列出的a)被假定为bean的本地业务接口。

因此,在EJB 3.2中,支持它。请注意,在本文正下方有一个完全符合您个案的示例。

所以我想你的问题归结为:

  • 您使用的应用服务器是什么?
  • 服务器有哪些EJB版本?