Précédent   Forum des professionnels en informatique > Java > Général Java > Spring
Spring Forum d'entraide pour le framework Spring. Avant de poster -> FAQ Spring
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 05/12/2008, 15h55   #1
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Par défaut Problème avec un Pointcut sur une methode dans une classe utilisant les generics

Bonjour,

Je voudrais utiliser Spring AOP sur la méthode securedActionListener suivante dans une classe abstraite nommée AbstractSecuredBean , cette classe utilise des generics and le code est :

Code java :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.application.view.bean;
...
...
public abstract class AbstractSecuredBean<Item> extends AbstractTabContentBean {
 
	private ActionReference securedAction;
	private Item securedItem;
 
	public void securedActionListener(final ActionEvent event){
		final UIComponent component = event.getComponent();
		if (component instanceof HtmlSecuredComponent) {
			this.securedAction = ActionReference.valueOf(((HtmlSecuredComponent)component).getSecuredAction());
			this.securedItem = (Item) ((HtmlSecuredComponent)component).getSecuredItem();
		}
	}
 
...
...
}

J'ai créé un advice Around avec le point de coupe suivant :

Code java :
1
2
3
4
5
6
@Around("execution(* com.application.view.bean.AbstractSecuredBean.securedActionListener(..))")
public void log(ProceedingJoinPoint method) throws Throwable {
...
some code
...
}

Et jamais durant l'execution cet advice est exécuté, auriez vous une idée ?

Merci d'avance pour vos idées,
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2008, 16h31   #2
Expert Confirmé Sénior
 
Avatar de djo.mos
 
Inscription : octobre 2004
Messages : 4 671
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 4 671
Points : 5 618
Points : 5 618
Salut,
Peut être que ça vient du fait que le type que tu références dans le pointcut, le "AbstractSecuredBean" n'est jamais instancié, mais plutôt ses descendants.

Ca donne quoi en remplaçant par le(s) type(s) concret(s) ? voire par un *
__________________
Mon Blog | Mes Cours | Moi sur twitter
djo.mos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2008, 17h31   #3
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
En remplaçant par un type concret CreateProductFormBean (cf. hiérarchie des classes en pièce jointe) l'advice devient donc :

Code java :
@Around("execution(* com.application.view.bean.docinfo.CreateProductFormBean.securedActionListener(..))")

Et avec le caractère * :

Code java :
@Around("execution(* com.application.view.bean.docinfo.*.securedActionListener(..))")

Dans les deux cas, je ne passe pas dans l'advice mais en debug je passe bien dans securedActionListener.

D'autres idées ? Y aurait il un problème avec l'utilisation des types génériques ?

Merci d'avance pour vos idées.
Images attachées
Type de fichier : jpg 2008-12-05_171731.jpg (29,3 Ko, 4 affichages)
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2008, 18h52   #4
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Une question avant d'aller plus loin, en lisant la doc de reference pour Spring 2.5 http://static.springframework.org/sp...rence/aop.html

Je lis :

Citation:
...
Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans).
...
Donc ,si la classe AbstractSecuredBean<Item> n'est pas déclarée comme bean dans le fichier XML de config Spring , Spring AOP ne fonctionnera pas ?
Am I right ?

Si c'est vrai , quelles sont les solutions ? configuré la classe en bean ou utiliser AspectJ ?)

Merci d'avance
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2008, 19h44   #5
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 245
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 245
Points : 2 671
Points : 2 671
Citation:
Envoyé par elitost Voir le message
Une question avant d'aller plus loin, en lisant la doc de reference pour Spring 2.5 http://static.springframework.org/sp...rence/aop.html

Je lis :



Donc ,si la classe AbstractSecuredBean<Item> n'est pas déclarée comme bean dans le fichier XML de config Spring , Spring AOP ne fonctionnera pas ?
Am I right ?

Si c'est vrai , quelles sont les solutions ? configuré la classe en bean ou utiliser AspectJ ?)

Merci d'avance
oui il faut que la classe soit utilisée dans un bean…

AspectJ est la solution la plus puissante pour s'affranchir des limitations…
JeitEmgie est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2008, 20h22   #6
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Bon, je vais allez voir demain le concepteur et négocier avec lui pour beaner tout ça sinon AspectJ...

D'autres idées ? conseils ? avant que je résolve...

Bonne fin de week end
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2008, 19h02   #7
Membre habitué

 
Inscription : juillet 2007
Messages : 145
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 145
Points : 143
Points : 143
Je te confirme qu'avec Spring AOP, seuls les Beans Spring bénéficient de l'AOP... En même temps c'est un peu normal, vu que ça marche via des proxy JDK : Spring crée un proxy autour de tes objets, et c'est ainsi qu'il rajoute l'AOP.

Pour ton problème précis, tu as en fait un problème sur la définition de ton PointCut : si je comprends bien, tu veux avoir accès à toutes les méthodes des beans qui implémentent AbstractSecuredBean, et pour cela tu peux utiliser le "+" : cf. la doc d'AspectJ http://www.eclipse.org/aspectj/doc/r...pointcuts.html (recherche "subtype patterns").
Ainsi, si tu fais ton pointcut sur "AbstractSecuredBean+", ça devrait marcher.

Sinon, le plus simple reste de faire une annotation et de faire ton pointcut dessus. C'est d'ailleurs ainsi que Spring Security fonctionne (avec @Secured ou le @RolesAllowed de la JSR 250, les deux marchent). Les annotations, c'est vraiment super pour faire des pointcuts :-)
__________________
Julien Dubois

http://www.ippon.fr
julien.dubois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2008, 21h56   #8
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Salut Julien,

Merci pour tes précisions et pour l'astuce du pointcut sur annotation ( un exemple de mise en oeuvre ? (je suis d'humeur paresseuse ce soir) ), je prends note de tout ça et proposerai les diverses options demain.

Bonsoir à tous.
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2008, 23h35   #9
Membre habitué

 
Inscription : juillet 2007
Messages : 145
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 145
Points : 143
Points : 143
Un exemple intéressant : regardons le code même de Spring!! Comme nous venons justement de releaser il y a deux jours le code source de la 3.0M1, je te propose de jeter un coup d'oeil à l'aspect qui gère les transactions, directement dans Subversion :

https://src.springframework.org/svn/...ctionAspect.aj

Bien entendu, il ne doit pas y avoir une grosse différence par rapport à Spring 2.5, mais j'aime bien utiliser la dernière version :-)
Bref, c'est ainsi que fonctionne l'annotation @Transactionnal, qui permet de rendre une méthode transactionnelle : on fait une "coupe" sur toutes les méthodes qui ont cette annotation. Simple et efficace!

Pour les fans des EJBs, je précise que @TransactionAttribute marche tout aussi bien que le @Transactionnal, Spring comprennant les 2 annotations...

Enfin, mon exemple précédent sur Spring Security (avec @Secured et @RolesAllowed) est tout à fait valable pour ce même exemple.
__________________
Julien Dubois

http://www.ippon.fr
julien.dubois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2008, 00h07   #10
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Super, je crois qu'il y a tout ce qu'il faut là.

Merci Julien.

Je marque comme résolu et bonne nuit à tous.
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 18h23.


 
 
 
 
Partenaires

Hébergement Web