在GlassFish 5中,EJB未注入实体监听器

时间:2017-12-10 18:15:01

标签: jpa java-ee glassfish eclipselink java-ee-8

我目前正在开发一个使用Java EE 8和GlassFish 5的Web应用程序。

其中一个应用程序的实体具有文件,用于存储最后一次创建和修改实体以及由谁修改的实体。此实体使用实体侦听器进行批注,该实体侦听器将在实体持久化或合并时更新这些字段。

@Entity
@EntityListener(CreatedAndModifiedListener.class)
public class MyEntity extends AbstractEntity {
    // AbstractEntity provides the ID field and equals(), hashCode() and toString()

    Instant createdOn;
    Instant modifiedOn;
    String createdBy;
    String modifiedBy;

    // Other fields
}

public class CreatedAndModifiedListener {

    @Inject
    UserService userService; // Stateless EJB

    @PrePersist
    @PreUpdate
    public void prePersist(Object o) {
        // Here, this.userService is null !
    }

}

@Stateless
public class UserService {
    public String getUser() {
        return "todo";
    }
}

毕竟,我的代码与http://hantsy.blogspot.de/2013/12/jpa-21-cdi-support.html

中的代码非常相似

当我使用GlassFish 5运行应用程序并且实体将被持久化或合并时,将按预期调用“prePersist()”,但不会注入EJB(userService为null)。

我使用hantsy(https://github.com/hantsy/ee7-sandbox/tree/master/jpa/converter)提供的转换器示例重现了这种行为,其中记录器被注入实体监听器。但是,当我在GlassFish 4.1.1中使用hantsy的示例时,它会按预期运行(记录器被注入,没有错误)。当我使用GlassFish 5的示例时,它会失败(NPE,因为没有注入记录器)。

我是否缺少为JPA 2.2启用CDI的注释或配置?或者这是GlassFish 5或Eclipse Link 2.7.0中的错误?

编辑(2017-12-16):我已将GlassFish 4.1.1中的Eclipse Link更新为2.7.0.v20170811。现在,GF 4.1.1的行为相同。因此,行为必须与当前的EL版本相关。

0 个答案:

没有答案