2017-07-22 159 views
0

我正在使用JPA,Guice Persist用於我的GAE項目,Restlet用於REST界面。引擎蓋下老Hibernate提供JPA服務。用Guice/GuicePersist注入休眠攔截器

enter image description here enter image description here

這就像一個魅力,吉斯注入必要的JPA部分進入我的課,例如在RestletServletEntityManager;

enter image description here

現在我想用一個SessionInterceptor插入創建/編輯時間戳和當前的活躍用戶到我的實體。在舊項目中,我使用帶有ThreadLocal變量的靜態HibernateUtil類來存儲會話。在我的新項目中,我想用Guice解決這個問題。 Guice需要在我的SessionInterceptor中注入EntityManager,所以我可以從數據庫加載當前活動用戶。

SessionInterceptor需要在Hibernate上下文中創建,並且不允許在啓動後對其進行配置。因此我創建了一個使用Guice Injector的SessionInterceptorFactory。在persistence.xml

enter image description here

enter image description here

這個工程(是它醜陋的),我有吉斯注射SessionInterceptor

enter image description here

但是當我嘗試此代碼;

enter image description here

[ERROR] 1)爲否javax.persistence.EntityManager執行是 界。 [ERROR]而定位 com.google.inject.Provider [ERROR]
爲 com.ludus.server.hibernate.SessionInterceptor的第一參數。(SessionInterceptor.java:20) [ERROR]而定位com.ludus .server.hibernate.SessionInterceptor

我需要連接(bound)的JPA(休眠)與吉斯的SessionInterceptor像我一樣用RestletServlet,但如何配置?

誰能幫我配置這個Guice?

除此之外,當前SessionInterceptorFactory是一個'髒的Guice黑客',有沒有一個乾淨的Guice解決方案呢?

回答

0

問題在於,您要在SessionInterceptorFactory中創建一個全新的(且空的)進樣器,此時您要做的就是將其連接到其他位置的主噴射器中。

當試圖將Guice集成到依賴注入之前的工具中時,這是一個相當普遍的問題:如果配置只給你提供「工廠類」而不是接受實例的選項,那麼你別無選擇而是通過靜態變量傳遞參考。你可以通過使用線程本地來實現這個功能,但這不是很令人滿意。

然而,在Hibernate的情況下,您可以使用API​​來構建SessionFactory而不是使用配置文件來清理此問題。您可以在Configuration對象上調用setInterceptor方法,該對象構建您的SessionFactory。您目前尚未顯示您是如何創建此項目的。

+0

Hello Tim,與Guice堅持在createInjector中使用JpaPersistModule並在persistence.xml(https://github.com/google/guice/wiki/JPA)中指定JPA/Hibernate配置。我將不得不檢查這是如何完成的代碼... –