我目前正在开发一个使用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版本相关。