我能否通过一个无状态 EJB 实现 CDI-1.0 或 -2.0 注入多个接口?

Can I CDI-1.0 or -2.0-inject multiple interfaces implemented by one Stateless EJB?

就像下面的例子:

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规范中找不到任何部分,这似乎给出了方向的提示。如果有人能指出正确的地方,我将不胜感激。

这个问题也没有回答注入部分,可能已经过时,有趣的 link 已经死了:Can an EJB bean implement multiple interfaces?

有什么想法吗?

所以,首先,CDI 并不是这里的坏人 - 事实上,从 CDI 的角度来看,拥有一个具有两个接口的 bean,您可以毫无问题地基于这些接口注入两个 bean。

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

来自 EJB 3.1 规范,第 4.9.7 节会话 Bean 的业务接口:

If the bean does not expose any other client views (Local, Remote, No-Interface, 2.x Remote Home, 2.x Local Home, Web Service) and the bean class implements a single interface, that interface is assumed to be the business interface of the bean. This business interface will be a local interface unless the interface is designated as a remote business interface by use of the Remote annotation on the bean class or interface or by means of the deployment descriptor.

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

但是,转到 EJB 3.2,还是第 4.9.7 节会话 Bean 的业务接口:

If the bean class is annotated with the Local annotation, or if the bean class is annotated with neither the Local nor the Remote annotation, all implemented interfaces (excluding the nterf aces listed above) are assumed to be local business interfaces of the bean.

因此,EJB 3.2 支持它。请注意,就在这段文字的下方,有一个完全符合您的情况的示例。

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

  • 你用什么应用服务器?
  • 服务器的EJB版本是多少?