用Guice / GuicePersist注入Hibernate拦截器
我正在使用JPA和Guice Persist作为我的GAE项目,Restlet作为REST接口。 在良好的旧Hibernate提供JPA服务。
这就像一个魅力,Guice将必要的JPA部分插入到我的类中,例如RestletServlet
的EntityManager
;
现在我想使用SessionInterceptor
将创建/编辑时间戳和当前活动用户插入到我的实体中。 在旧的项目中,我使用了带有ThreadLocal变量的静态HibernateUtil
类来存储会话。 在我的新项目中,我想用Guice解决这个问题。 Guice需要在我的SessionInterceptor
注入一个EntityManager
,这样我就可以从数据库加载当前的活动用户。
SessionInterceptor
需要在Hibernate上下文中创建,不允许在启动后对其进行配置。 因此我创建了一个使用Guice Injector的SessionInterceptorFactory
。 在persistence.xml
这工作(是它的丑陋),我有一个与Guice注入SessionInterceptor
。
但是当我尝试这个代码;
[错误] 1)未绑定javax.persistence.EntityManager的实现。 查找com.google.inject.Provider [错误]时出现[错误]
com.ludus.server.hibernate.SessionInterceptor的第一个参数(SessionInterceptor.java:20)[ERROR]查找com.ludus.server.hibernate.SessionInterceptor时
我需要连接( bound
)JPA(Hibernate)配置与Guice中的SessionInterceptor
,就像我使用RestletServlet
,但是如何实现?
谁可以用这个Guice配置来帮助我?
除此之外,当前的SessionInterceptorFactory
是一个'肮脏的Guice黑客',有没有一个干净的Guice解决方案呢?
问题在于你在SessionInterceptorFactory
创建了一个全新的(并且是空的)注入器,当你想要做的就是把它挂到你在其他地方的主注入器中。
当试图将Guice集成到依赖注入之前的工具时,这是一个相当常见的问题:如果配置只给你提供“工厂类”而不是接受实例的选项,那么你别无选择,只能通过通过一个静态变量引用。 你可以通过使用线程本地来实现这个功能,但这不是很令人满意。
然而,在Hibernate的情况下,您可以通过使用API来构建SessionFactory
而不是使用配置文件来清理它。 您可以在构建SessionFactory
的Configuration
对象上调用setInterceptor
方法。 您目前尚未显示您是如何创建此项目的。
上一篇: Inject a Hibernate Interceptor with Guice / GuicePersist
下一篇: Inject Configuration in Guice AbstractModule in Dropwizard Application