2017-07-22 12 views
0

Ich verwende JPA mit Guice Persist für meine GAE-Projekte und Restlet für die REST-Schnittstelle. Unter der Haube liefert der gute alte Hibernate den JPA-Dienst.Inject ein Hibernate Interceptor mit Guice/GuicePersist

enter image description here enter image description here

Dies wirkt wie ein Zauber, und Guice injiziert notwendig JPA Teile in meinen Klassen, zum Beispiel ein EntityManager im RestletServlet; einfügen Erstellen/Bearbeiten der Zeitstempel und aktuelle aktive Benutzer auf meine Entitäten

enter image description here

Jetzt möchte ich eine SessionInterceptor verwenden. In alten Projekten habe ich eine statische HibernateUtil Klasse mit ThreadLocal-Variablen verwendet, um die Sitzungen zu speichern. In meinem neuen Projekt möchte ich das mit Guice lösen. Guice muss eine EntityManager in meinem SessionInterceptor injizieren, damit ich den aktuellen aktiven Benutzer aus der Datenbank laden kann.

Die SessionInterceptor muss in einem Hibernate-Kontext erstellt werden, und es ist nicht erlaubt, dies nach dem Start zu konfigurieren. Daher habe ich eine SessionInterceptorFactory erstellt, die einen Guice Injector verwendet. In persistence.xml

enter image description here

enter image description here

Das funktioniert (ja ihr hässliches), habe ich eine SessionInterceptor mit Guice Injection.

enter image description here

Aber wenn ich versuche, diesen Code;

enter image description here

[ERROR] 1) war keine Umsetzung für javax.persistence.EntityManager gebunden. [ERROR] während com.google.inject.Provider [ERROR]
für den ersten Parameter von com.ludus.server.hibernate.SessionInterceptor. (SessionInterceptor.java:20) [ERROR] während Ortung com.ludus Ortung .server.hibernate.SessionInterceptor

ich verbinde müssen (bound) die JPA (Hibernate) Konfiguration mit dem SessionInterceptor in Guice, wie ich mit dem RestletServlet tat, aber wie?

Wer kann mir mit dieser Guice-Konfiguration helfen?

Abgesehen davon ist der aktuelle SessionInterceptorFactory ein "schmutziger Guice Hack", gibt es dafür eine saubere Guice Lösung?

Antwort

0

Das Problem ist, dass Sie einen brandneuen (und leeren) Injektor in Ihrem SessionInterceptorFactory erstellen, wenn Sie es in den Hauptinjektor einhängen möchten, den Sie woanders haben.

Dies ist ein ziemlich häufiges Problem beim Versuch, Guice in Tools zu integrieren, die die Abhängigkeitsinjektion vor dem Datum einbeziehen: Wenn die Konfiguration nur die Möglichkeit bietet, eine "Factory-Klasse" bereitzustellen, dann haben Sie keine Wahl aber um die Referenz über eine statische Variable zu übergeben. Sie können dies ziemlich robust machen, indem Sie es mit einem thread-local tun, aber es ist nicht sehr zufriedenstellend.

Im Fall von Hibernate können Sie dies jedoch aufräumen, indem Sie die API verwenden, um SessionFactory zu erstellen, anstatt die Konfigurationsdatei zu verwenden. Sie können setInterceptor Methode auf dem Configuration Objekt aufrufen, das Ihre SessionFactory baut. Sie haben nicht gezeigt, wie Sie das gerade erstellen.

+0

Hallo Tim, mit Guice Persist verwenden Sie JpaPersistModule im createInjector und geben Sie die JPA/Hibernate-Konfiguration in persistence.xml (https://github.com/google/guice/wiki/JPA) an. Ich werde prüfen müssen, wie das mit Code gemacht wird ... –

Verwandte Themen