Comment puis-je passer des arguments à Spring AOP conseils avec annoté paramètres?
Je suis à l'aide de Printemps 3.1.2.VERSION avec cglib au moment du chargement de tissage et je suis en train d'essayer d'obtenir des conseils pour travailler avec une méthode qui a personnalisé les annotations et annoté paramètres.
Conseils:
@Aspect
public class MyAdvice
{
@Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
"&& args(batch) && @args(propertyToLock)"
public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch, LockVal propertyToLock) throws Throwable {
//Do stuff....
pjp.proceed();
}
}
Ici est la classe que je suis en train de tester:
public interface UpdateManager
{
public void processUpdate(MyBatchObject batch);
}
public class UpdateManagerImpl implements UpdateManager
{
@Lock
public void processUpdate(@LockVal("lockValue") MyBatchObject batch)
{
//Do stuff...
}
}
Le problème est que je ne peux pas obtenir les conseils à exécuter. Si je supprime le @args args et conditions de la coupe transverse (pointcut), les conseils des incendies, mais ensuite, je dois creuser par le biais de la ProceedingJoinPoint pour obtenir le paramètre que j'ai besoin.
Pourquoi ne pas les conseils de cuisson? Ai-je fais quelque chose de mal?
Modifier: La suite de coupe transverse (pointcut) NE fonctionne pas comme un programme autonome avec le Printemps:
@Aspect
public class MyAdvice
{
@Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
"&& args(batch)"
public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch) throws Throwable {
//Do stuff....
pjp.proceed();
}
}
Toutefois, il ne fonctionne PAS sous JBoss 6 en utilisant les temps de charge de tissage. Je suppose que ma question doit être, alors, pourquoi a-t-il comme un programme autonome, mais pas sous JBoss 6?
J'ai abandonné ce projet, mais je peux dire que le code n'a jamais travaillé, n'importe comment, j'ai couru. Je me souviens, il avait quelque chose à voir avec le plat de chargeur de classe + cglib dans JBoss 6, qui diffère de la version précédente.
OriginalL'auteur Brad | 2013-05-17
Vous devez vous connecter pour publier un commentaire.
Mise à jour: j'ai oublié de mentionner que
@args()
n'est pas supposé correspondre à un paramètre de l'annotation, mais un type de paramètre de l'annotation, ce qui n'est pas ce que vous voulez et qui, par conséquent, je n'utilise pas ici.Vous ne pouvez pas lier un paramètre de l'annotation via
args()
, seul le paramètre lui-même. Cela signifie que vous ne pouvez accéder à ce paramètre de l'annotation par la réflexion. Vous devez déterminer la méthode de la signature, de créer unMethod
objet à partir d'elle, puis itérer sur les paramètres de la méthode' annotations. Voici un exemple de code complet:Quand je lance
UpdateManagerImpl.main
, je vois la sortie suivante, tout aussi attendu:Avertissement: je ne suis pas un Printemps gars, je viens de tester cela avec la plaine AspectJ, pas de Printemps de l'AOP.
Aussi, j'ai tenté de supprimer le
@args
de la coupe transverse (pointcut) tout à fait, mais la coupe transverse (pointcut) n'est pas encore exécutée. Quelque chose à propos de laargs()
condition est à l'origine de la panne, parce que lorsque je supprime ces deux conditions, la coupe transverse (pointcut) exécute comme prévu.Utiliser mon code, il fonctionne. Comme pour
@args
, si vous attrapez un paramètreMyType foo
,@args
seulement correspond à une annotation déclaré sur la classeMyType
, pas sur le paramètre de méthode.J'ai essayé d'utiliser ce code comme vous l'avez suggéré, mais la coupe transverse (pointcut) ne s'est pas exécuté. Si je supprime le
args(batch)
condition, il n'.Ensuite, vous n'avez pas utilisé la totalité de mon code ou vous avez mal réglé à votre code. J'ai posté l'exemple complet avec les annotations, les importations et les noms de paquets sur le but, vous pouvez voir l'image complète. Si vous ne faites pas d'erreurs de réglage ou si il n'y a pas une différence fondamentale entre le Printemps AOP et AspectJ, vous devriez être bien.
OriginalL'auteur kriegaex
Ce n'est pas une solution, mais devrait vous prendre un peu plus loin:
Je suis en supposant que vous avez fait une faute de frappe dans votre annotations, vous signifiait probablement
@Aspect
et pas@Advice
?La suggestion que j'ai serait d'essayer ces:
un. Séparer en point coupes et les conseils que vous souhaitez appliquer sur la coupe transverse (pointcut):
b. Il se pourrait que ce soit
args
expression ou@args
expression est à l'origine du problème - essayez de garder l'un et retrait des autres et de voir quelle combinaison fonctionne.c. Si cela ne permet pas de cerner les choses, une autre option pourrait être d'ajouter explicitement une
argNames
expression aussi, il se pourrait que l'argument des noms sont nettoyés et n'est pas compensée par le nom au moment de l'exécution:args()
, seul le paramètre lui-même. Voir ma propre réponse.J'ai essayé a) et b), sans succès. Je travaille sur des tests c) - merci pour la suggestion!
Quand j'ai essayé de la coupe transverse (pointcut):
execute(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal (*))) && args(batch) && argNames(\"batch\")
j'ai reçu le message d'erreurerror at ::0 multiple bindings0, BindingTypePattern(java.lang.Object, 0)
OriginalL'auteur Biju Kunjummen