使用 Guice / GuicePersist 注入 Hibernate 拦截器

Inject a Hibernate Interceptor with Guice / GuicePersist

我正在使用 JPA Guice Persist for my GAE projects and Restlet for the REST interface. Under the hood good old Hibernate 提供 JPA 服务。

这就像一个魅力,Guice 将必要的 JPA 部分注入我的 classes,例如 RestletServlet 中的 EntityManager

现在我想使用 SessionInterceptor 将 create/edit 时间戳和当前活跃用户插入我的实体。在旧项目中,我使用带有 ThreadLocal 变量的静态 HibernateUtil class 来存储会话。在我的新项目中,我想用 Guice 解决这个问题。 Guice 需要在我的 SessionInterceptor 中注入一个 EntityManager 以便我可以从数据库加载当前活动用户。

SessionInterceptor 需要在 Hibernate 上下文中创建,并且不允许在启动后配置它。因此,我创建了一个使用 Guice Injector 的 SessionInterceptorFactory。在persistence.xml

这有效(是的,它很丑),我有一个 SessionInterceptor 与 Guice 注入。

但是当我尝试这段代码时;

[ERROR] 1) No implementation for javax.persistence.EntityManager was bound. [ERROR] while locating com.google.inject.Provider [ERROR]
for the 1st parameter of com.ludus.server.hibernate.SessionInterceptor.(SessionInterceptor.java:20) [ERROR] while locating com.ludus.server.hibernate.SessionInterceptor

我需要连接 (bound) JPA (Hibernate) 配置与 Guice 中的 SessionInterceptor 就像我连接 RestletServlet 一样,但是如何连接?

谁能帮我配置这个 Guice?

除此之外,当前的 SessionInterceptorFactory 是 'dirty Guice hack',是否有针对此的干净的 Guice 解决方案?

问题是您正在 SessionInterceptorFactory 中创建一个全新的(空的)注入器,而您要做的是将它连接到其他地方的主注入器中。

在尝试将 Guice 集成到早于依赖项注入的工具中时,这是一个相当普遍的问题:如果配置只为您提供提供 "factory class" 而不是接受实例的选项,那么您有别无选择,只能通过静态变量传递引用。您可以通过使用线程本地来使它非常健壮,但它不是很令人满意。

然而,在 Hibernate 的情况下,您可以通过使用 API 构建您的 SessionFactory 而不是使用配置文件来整理它。您可以在构建 SessionFactoryConfiguration 对象上调用 setInterceptor 方法。你目前还没有展示你是如何创建这个的。