J'ai une application Spring Cadre 4 qui utilise Hibernate 4.3.8 en tant que fournisseur JPA. Je souhaite utiliser des filtres hibernate et donc je dois leur permettre. Je veux le faire globalement dans l'application, que j'essaie de faire avec le Spring AOP. L'idée est que je puisse écrire un aspect qui permet aux filtres chaque fois qu'une session est créée / récupérée, comme dans Ceci et Cette question.
J'ai ajouté le Mon problème est que le conseil ci-dessus ( Je soupçonne que cela est causé Par comment je configurais hibernate, car je ne configure pas un Spring-aop code> et
aspectJweaver code> dépendances à mon projet (à l'aide de Maven). J'ai ajouté l'aspect suivant. P>
activerFilters code>) n'est jamais invoqué; Ni le texte n'est imprimé, ni mon filtre n'est activé. J'ai vérifié que mon aspect est détecté et que AOP fonctionne dans mon projet en modifiant la pointe de l'une de mes propres classes. J'ai également essayé de changer le point de pointe sur
exécution (* org.ibernate.sesssfactory.opensession (..)) code>, mais sans résultat. P>
SéanceFactory code> explicitement; J'ai plutôt mis en place un
entitymanagerfactory code>. Voici ma configuration. P>
@Configuration
@ComponentScan(basePackages = { ... })
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
// ...
}
3 Réponses :
Peut-être que ce n'est que le fait que vous déclarez le pointCut à l'aide de l'interface La manière appropriée consiste à définir l'exécution de PointCut au fur et à mesure de la mise en œuvre de cette interface et de la notation pour cela n'est qu'un bit différent, voir le signe Aussi une notation alternative ... p>
Vous devez également consulter aspectj-triche-feuille < / a> p>
concernant A Indiquez si les procurations sous-classes basées sur la sous-classe (CGLIB) doivent être créées, par opposition à des proxies de l'interface Java standard. P>
blockQuote>
Mais puisque la classe que vous essayez de sous-classe est Il s'agit d'une erreur de compilation si le nom d'une classe finale apparaît dans la clause étendue (§8.1.4) d'une autre déclaration de classe; Cela implique qu'une classe finale ne peut avoir de sous-classes. P>
blockQuote> org.hibernate.sessfactory code> comme argument d'exécution ... p>
@pointCut ("exécution (* org.hibernate.sesssfactory.getCurtionSession.gecurrentSession (..))") code> p>
+ p> p>
@pointCut ("Exécution (* org.hibernate.sessfactory + .getCurrentSession (..))") code> p> p>
@pointcut ("dans (ORG.Hibernate.SessieFactory +) && Exécution (* getCurrentSession (..))") code> p>
java.lang.illegalargumentException: ne peut pas sous-classer la classe finale code>.
La classe ciblée est la mise en œuvre concrète de
org.ibernate.sessfactory code> nommément
org.hibernate.internal.sessfactoryimpl code> qui se trouve être final,
Séance de classe finale publique code>. p>
proxyTargetClass = Vrai code> Configuration selon le documentation p>
finale code> Il y a un peu de problème en fonction du Spécification de la langue Java P>
Merci pour votre réponse! Malheureusement, j'ai essayé les points de pointe que vous avez mentionnés, mais ils ne travaillaient pas pour moi.
Avez-vous essayé d'utiliser un localentitymanagerfactorybean code> au lieu de
localContainerentityManagerFactorybean code>? Je ne suis pas un expert dans ce domaine, mais je sais que c'est le premier qui produit un entittityManagerFactoryFactoryFactory et non géré par le conteneur, qui est produit par ce dernier ... et nous voulons vraiment le printemps pour gérer cela afin que l'AOP travaux :)
Maintenant, je comprends que l'AOP est cool et tout cela, mais vous devriez vraiment jeter un coup d'œil aux solutions possibles suivantes impliquant également la gestion de la session: org.springframework.orm.hibernate4.support.opensessioninc eptor ou Org.hibernate.SessieventListener
Ou encore mieux, examinez cet article abondant à l'aide de SPI d'Hibernate Événement géré-Spring-Souditeurs-avec-JPA . Je parie que cela peut présenter une alternative beaucoup plus décente à cette inoption Contraction :)
Je pense que cela devrait se présenter comme une alternative également OpenSessionInviewFilter
J'ai examiné vos propositions. Hibernate's SPI semble être une bonne solution, mais j'ai pris un coup d'œil sur le types d'événements disponibles , et je n'ai pas pu trouver un approprié à utiliser. En théorie, je suppose que je pourrais utiliser l'événement init_collection code>, mais je ne veux pas activer un filtre à chaque fois appelé (potentiellement plusieurs fois). Des idées ici? Je ne pense pas que l'opensessionInviewFilter est applicable ici, car il étend simplement la durée de vie de la session à la durée de la demande.
Concernant OpenSessessInterceptor code>, comment avez-vous imaginé que cela puisse être utilisé? Je comprends comment l'intercepteur fonctionne, mais je ne suis pas sûr à 100% comment l'appliquer à mon cas d'utilisation. L'intercepteur lui-même ne me donne aucun contrôle de la session. J'imagine donc que je devrais utiliser un conseil et faire une pointe à cet intercepteur afin de manipuler la session? J'ai l'impression d'avoir presque compris avec le Aide de la documentation , mais je manque toujours des morceaux dans l'ordre Pour l'appliquer à mon projet. Toute aide ici serait très appréciée!
Pour Hibernate 4 Spring fournit un accès à 'ORG.Hibernate.SessFactory' par org.springframework.orm.hibernate4.localsesssFactoryBuilde r CODE> Et c'est un haricot géré à ressort et tout point de pointe AOP s'appliquera évidemment. Je ne sais tout simplement pas si c'est suffisamment polyvalent pour que vous obteniez exactement ce que vous recherchez
Désolé, il s'agit du haricot d'usine non aussi obsolète qui crée une usine de session hibernate ... org.springframework.orm.hibernate4.localsesssessorybean code> Vous pouvez alors gâcher avec
Votre classe d'aspect semble bonne.
Ajouter @filter strong> et @filterdef strong> sur vos entités: p> Exemple: p> dans votre configuration, le filtre est activé, mais n'a aucun paramètre. P> exemple à tester: < / p> Bien sûr, vous pouvez définir autant de paramètres que nécessaire dans @Filterdef Annotation. P> En espérant que cela vous aide. Cordialement, Andrà ©. P> P>
J'ai déjà déclaré le filtre dans mon entité, mais le problème est que le filtre n'est jamais activé à la session. Ceci est censé arriver à mon aspect, mais le filtre n'est jamais activé car ce code n'est pas exécuté. Mon filtre n'a pas besoin d'un paramètre, je n'ai donc pas ajouté aucun paramètre.
faisait face à la question exacte. J'ai pu le résoudre en utilisant EntityManager et obtenir les informations de session à l'aide de sa méthode de débit plutôt que d'obtenir les informations de session à l'aide de Pointe Cut autour de l'appel GetCurrentSession de SéditionFactory.
@PersistenceContext private EntityManager entityManager; @Around("myPointcut") public Object enableGlobalFilter(ProceedingJoinPoint pjp) throws Throwable { Session session = entityManager.unwrap(Session.class); Filter filter = session.enableFilter("Published_Entity"); filter.setParameter("is_publishedParam", true); Object obj = pjp.proceed(); session.disableFilter("Published_Entity"); return obj; }
Peut-être un
@ComponentsCan ("org.hibernate") code> aide?
@Ruben Non, ça ne fait pas une différence.
Vous interceptez le
SéanceFactory code> mais utilisez un JPA uni (avec hibernate comme implémentor). Cela ne va évidemment jamais lancer, il n'y a pas de
SéanceFactory code> dans votre config et que votre aspect correspondra donc à rien. Écrivez le point coupé pour le
entitymanagerfactory.getentitymanager code> à la place.
@ M.Deinum qui a du sens. Je l'ai essayé, mais je ne pouvais pas le faire travailler. Si j'ai
@enableaspypjautoproxy (proxytargetclass = true) code> défini, je reçois l'exception suivante:
java.lang.illegalargumentException: ne peut pas sous-classer la classe finale code>. Si je retire l'annotation, mon projet compile, mais le pointCut ne fonctionne pas. J'ai essayé divers points de pointe directement sur
localContainerentityManagerFactorybean code>, mais jusqu'à présent pas de chance.
Et votre
appconfig code> et
persistenceConfig code> sont chargés dans le même contexte? AOP fonctionne uniquement pour les haricots définis dans le même contexte d'application.
Au meilleur de ma connaissance, oui. Voici mon
web.xml code> et
appconfig code>: Pastebin.com/df1rg0lu
Pourquoi avez-vous besoin
proxytargetclass code> quand même? Vous ne devriez pas avoir besoin de cela. De plus, je suggérerais de supprimer
AfterProgeresseSet () code> et
getObject () code> à partir de votre classe de configuration et laissez la poignée de ressort qui.