我在GAE项目中使用JPA Guice Persist,在REST界面使用Restlet。在引擎盖下,旧的Hibernate提供了JPA服务。
这就像魅力一样,Guice将必要的JPA部分注入我的课程,例如EntityManager
中的RestletServlet
;
现在我想使用SessionInterceptor
向我的实体插入创建/编辑时间戳和当前活动用户。在旧项目中,我使用带有ThreadLocal变量的静态HibernateUtil
类来存储会话。在我的新项目中,我想用Guice解决这个问题。 Guice需要在EntityManager
中注入SessionInterceptor
,以便我可以从数据库中加载当前活动用户。
需要在Hibernate上下文中创建SessionInterceptor
,并且不允许在启动后配置它。因此我创建了一个使用Guice Injector的SessionInterceptorFactory
。在persistence.xml
这是有效的(是的,它的丑陋),我有一个SessionInterceptor
与Guice Injection。
但是当我尝试这段代码时;
[错误] 1)没有javax.persistence.EntityManager的实现 界。定位时出现[错误] com.google.inject.Provider [错误]
时出现[错误]
对于第一个参数 com.ludus.server.hibernate.SessionInterceptor。(SessionInterceptor.java:20) 找到com.ludus.server.hibernate.SessionInterceptor
我需要将{({1}})JPA(Hibernate)配置与Guice中的bound
连接,就像我使用SessionInterceptor
一样,但是如何?
谁可以帮我处理这个Guice配置?
除此之外,当前RestletServlet
是一个'脏Guice hack',有没有一个干净的Guice解决方案呢?
答案 0 :(得分:0)
问题是你在SessionInterceptorFactory
中创建了一个全新的(和空的)注射器,当你想要做的是将它挂钩到你在其他地方的主注射器时。
当尝试将Guice集成到依赖注入之前的工具时,这是一个相当常见的问题:如果配置只为您提供了提供“工厂类”而不是接受实例的选项,那么您别无选择,通过静态变量传递引用。
,你可以通过本地线程来做到这一点非常强大。但是它并不是很令人满意。但是,对于Hibernate,您可以使用API构建SessionFactory
而不是使用配置文件来整理它。您可以在构建Configuration
的{{1}}对象上调用setInterceptor
方法。你现在还没有表明你是如何创造这个的。