2017-07-22 2 views
0

J'utilise JPA avec Guice Persist pour mes projets GAE et Restlet pour l'interface REST. Sous le capot bonne vieille Hibernate offre le service JPA.Injecter un intercepteur Hibernate avec Guice/GuicePersist

enter image description here enter image description here

Cela fonctionne comme un charme, et Guice injecte des pièces nécessaires JPA dans mes classes, par exemple un EntityManager dans le RestletServlet;

enter image description here

Maintenant, je veux utiliser un SessionInterceptor pour insérer créer/modifier et horodatages utilisateurs actifs en cours à mes entités. Dans les anciens projets, j'ai utilisé une classe HibernateUtil statique avec des variables ThreadLocal pour stocker les sessions. Dans mon nouveau projet, je veux résoudre ce problème avec Guice. Guice doit injecter un EntityManager dans mon SessionInterceptor afin que je puisse charger l'utilisateur actif actuel de la base de données.

Le SessionInterceptor doit être créé dans un contexte Hibernate et il n'est pas autorisé de le configurer après le démarrage. Par conséquent, j'ai créé un SessionInterceptorFactory qui utilise un injecteur Guice. Dans persistence.xml

enter image description here

enter image description here

Cela fonctionne (oui son laid), j'ai un SessionInterceptor avec injection Guice.

enter image description here

Mais lorsque je tente ce code;

enter image description here

[ERREUR] 1) Pas de mise en œuvre pour javax.persistence.EntityManager était lié. [ERREUR] tout en localisant com.google.inject.Provider [ERREUR]
pour le 1er paramètre de com.ludus.server.hibernate.SessionInterceptor. (SessionInterceptor.java:20) [ERREUR] tout en localisant com.ludus .server.hibernate.SessionInterceptor

Je dois vous connecter (bound) la configuration JPA (Hibernate) avec le SessionInterceptor dans Guice comme je l'ai fait avec le RestletServlet, mais comment?

Qui peut m'aider avec cette configuration de Guice? En dehors de cela, l'actuel SessionInterceptorFactory est un 'bidouille de Guice sale', y a-t-il une solution propre de Guice pour cela?

Répondre

0

Le problème est que vous créez un injecteur flambant neuf (et vide) dans votre SessionInterceptorFactory, lorsque ce que vous voulez faire est de le brancher dans l'injecteur principal que vous avez ailleurs.Il s'agit d'un problème assez commun lorsque vous tentez d'intégrer Guice dans des outils antérieurs à l'injection de dépendances: Si la configuration ne vous permet que de fournir une "classe usine" plutôt que d'accepter une instance, vous n'avez aucun choix mais pour passer la référence via une variable statique. Vous pouvez le rendre assez robuste en le faisant avec un thread local, mais ce n'est pas très satisfaisant. Toutefois, dans le cas d'Hibernate, vous pouvez le ranger en utilisant l'API pour créer votre SessionFactory plutôt que d'utiliser le fichier de configuration. Vous pouvez appeler la méthode setInterceptor sur l'objet Configuration qui constitue votre SessionFactory. Vous n'avez pas montré comment vous créez ceci en ce moment.

+0

Bonjour Tim, avec Guice Persist vous utilisez JpaPersistModule dans createInjector et spécifiez la configuration JPA/Hibernate dans persistence.xml (https://github.com/google/guice/wiki/JPA). Je vais devoir vérifier comment cela est fait avec du code ... –