Jakarta ee 在类库中使用@Inject注入EJB

Jakarta ee 在类库中使用@Inject注入EJB,jakarta-ee,glassfish,ejb,cdi,java-ee-7,Jakarta Ee,Glassfish,Ejb,Cdi,Java Ee 7,我有一个使用GlassFish服务器4.1/JavaEE7的成熟JavaEE应用程序。它是一个标准的NetBeans项目,即它不使用ApacheMaven 该应用程序包含一个名为“ProjectLibrary”的类库,该类库添加到两个模块中,即EE模块和web模块。IDE以图表的形式显示了基本的树结构,如下所示 @ApplicationScoped public class EntityListener { @Inject private Event<EntityChan

我有一个使用GlassFish服务器4.1/JavaEE7的成熟JavaEE应用程序。它是一个标准的NetBeans项目,即它不使用ApacheMaven

该应用程序包含一个名为“ProjectLibrary”的类库,该类库添加到两个模块中,即EE模块和web模块。IDE以图表的形式显示了基本的树结构,如下所示

@ApplicationScoped
public class EntityListener {

    @Inject
    private Event<EntityChangeEvent> event;

    @EJB
    private UserService service;

    @PostPersist
    @PostUpdate
    @PostRemove
    public void onEntityChange(Entity entity) {
        event.fire(new EntityChangeEvent(Collections.singleton(service.getOwner(entity))));
    }
}


需要将EJB注入JPA实体侦听器,如下所示

@ApplicationScoped
public class EntityListener {

    @Inject
    private Event<EntityChangeEvent> event;

    @EJB
    private UserService service;

    @PostPersist
    @PostUpdate
    @PostRemove
    public void onEntityChange(Entity entity) {
        event.fire(new EntityChangeEvent(Collections.singleton(service.getOwner(entity))));
    }
}
正式禁止在类库中使用
@inject
注入EJB吗


GlassFish 4.1使用Weld 2.2.2 final作为CDI实现。

如果应用程序库中没有包含
beans.xml
,则其中的任何组件都不符合CDI注入的条件,无论是作为接收注入点还是作为可注入到其他组件。当您添加
beans.xml
时,您这样做是为了让您的库可以被注入,并且它的类现在可以使用
@Inject


这是第二十二条军规。库的用途是它几乎没有外部依赖性,并且不知道如何使用它,因此通常不会在其中包含与CDI相关的代码。

如果使用
@Dependent
更改
@Stateless
,它是否部署?行为保持不变,如果EJB被
@依赖的
作用域的CDIBean替换(应用此更改后会导致相同的异常)。是否有任何原因要使用
@Inject
更改
@EJB
,如果它能工作?@Gas:
@Inject
享有比
@EJB
更高的优先级,对于EJB,我发现使用
@EJB
更好,因为只需查看代码,您就已经知道要注入什么,而不必检查其他类。正如您在案例中看到的,有时更新并不意味着更好。这种行为是否非常特定于GlassFish,或者是CDI实现和/或CDI规范中的一个疏忽。JPA规范规定,“持久性提供程序仅需要支持在Java EE容器环境中向实体侦听器中注入CDI。如果未启用CDI,则持久性提供程序不得调用依赖于CDI注入的实体侦听器。”给定示例中的侦听器依赖于CDI注入(
事件
)。当使用
@EJB
注入所述EJB时,会调用它,即CDI似乎已经在那里启用。多个规范已经声明了它们无法强制执行的内容。我怀疑这是glassfish特有的问题,因为它发生在其他容器中。GF可能会做一些不同的事情,因为它们默认用于
bean.xml
在根目录下,例如本例中的war。发生的情况是,您的库中没有为EJB创建任何bean定义。为什么在“库jar、EJB jar、应用程序客户端jar或rar归档文件是bean归档文件,如果它在
META-INF
目录中有一个名为
beans.xml
”的文件中提到了这一点?类似的原因。这些都应该是bean存档,但是不是CDI运行时进行调用,而是整个EE容器决定了这一点。