我目前正在开发一个使用 Java EE 8 和 GlassFish 5 的网络应用程序。
该应用程序的其中一个实体已归档存储上次创建和修改该实体的时间以及由谁创建和修改。该实体使用实体侦听器进行注释,该实体侦听器应在实体被持久化或合并时更新这些字段。
@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 为空)。
我已经使用由 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 版本相关。