2011-06-17 6 views
6

J'ai déclaré mes aspects en utilisant l'annotation @Aspect, mais le conseil ne semble pas s'appliquer. L'aspect fonctionne dans quelques autres projets que j'ai, et la différence clé semble être que les autres projets sont complètement câblés en utilisant des annotations, et ce projet particulier est xml filaire. Le seul bean qui est annoté est l'aspect. Je me demande donc si le support d'aspectj de spring, en utilisant aspectj-autoproxy est sensible à l'ordre que les beans sont définis dans le xml. Par exemple, est-ce que les beans seront déclarés après l'aspectj-autoproxy dans xml pour les coupes AOP?aspectj et spring avec aspectj-autoproxy

EDIT:

je me suis déplacé le <aop:aspectj-autoproxy /> jusqu'à ce que tous les haricots sont créés et toujours pas de chance.

Fondamentalement, mon code se compose de:

@Component 
@Aspect 
public class SomeAspect { 
    @Pointcut("@annotation(MyAnnotation)") 
    public void isX() {} 

    @After("isX()") 
    public void XX() { 
     System.out.println("Called aspect"); 
    } 
} 

Et mon contrôleur a quelque chose comme:

public class XController extends AbstractCommandController { 
    @MyAnnotation 
    public void handleX(...) { 
     // do stuff 
    } 
    @Override 
    protected void handle(...) { 
     return handleX(...); 
    } 
} 

Et puis le xml du printemps est:

<context:component-scan base-package="package.of.some.aspect" /> 
<aop:aspectj-autoproxy /> 

<!-- the rest of the beans below --> 
<bean id="someController" class="..." /> 

Mes projets précédents capturés et chargé tous les haricots via le composant-scan. C'est ce qui est différent cette fois.

EDIT2: L'autre différence est que les autres projets utilisent @Controller et @RequestMethod. Et dans ce cas j'utilise une classe dérivée de AbstractCommmandController. Je me demande si cela s'applique: http://forum.springsource.org/archive/index.php/t-46637.html

À savoir que je ne peux pas appliquer de conseils à une méthode sauf handleRequest().

EDIT3:

Mon dernier essai est de passer outre handleRequest() et y appliquer mon annotation. En supposant que lorsque le printemps transmettra mon contrôleur à son contrôleur, celui-ci verra l'annotation et appliquera le conseil, car il appelle la méthode publique appelée externe. Cela ne fonctionne toujours pas.

+0

Publiez du code s'il vous plaît; par exemple. l'appcontext qui définit l'aspect, le conseil et le pointcut (s). – abalogh

+0

@abalogh: J'ai l'impression que si je simplifie le code, cela fonctionnera. Quelle est la meilleure façon d'aborder le débogage aspectj/spring quand ce truc ne fonctionne pas comme prévu? – Kevin

Répondre

3

Je vois que vous appelez la méthode handleX directement à partir d'une autre méthode de la même classe. Cela ne respectera pas l'annotation, car le travail de traitement des annotations AOP est effectué par un proxy JDK qui enveloppe votre classe et expose les mêmes interfaces. Il est possible que vous puissiez contourner ce problème en utilisant CGLIB au lieu des proxys JDK, mais dans mon expérience, la solution la plus fiable est de ne compter sur aucune annotation AOP pour les méthodes appelées en interne.

+0

Oui, je comprends cela maintenant. Mais je ne peux pas appeler la méthode handle() de Spring parce qu'elle est protégée, et de toute façon c'est juste une méthode interne aussi (!). Ce n'est pas la méthode que le printemps appelle "extérieurement". Mais ce que je veux réaliser est d'intercepter et d'appliquer des conseils pour un sous-ensemble de tous les contrôleurs. Je ne vois pas vraiment comment je vais faire ça sans utiliser @ Controller/@ RequestMethod. Suggestions? – Kevin

+0

Je vais marquer cela comme la bonne réponse, mais il y avait deux problèmes.J'ai d'abord dû surcharger la méthode publique handleRequest et y mettre mon annotation. Et deuxième aspectj-autoproxy doit se produire seulement après que tous les beans sont instanciés. Alors tout fonctionne. – Kevin

+0

Pour être honnête, je n'ai pas utilisé Aspectj-autoproxy. J'utilise principalement d'autres intégrations AOP (@Transactional, certaines des choses de Spring Security, etc.). Un de mes collègues a trouvé un problème: les annotations Spring Security ne semblent pas être respectées sur les méthodes de contrôleur avec @RequestMapping. Je me demande si c'est lié. – Dan

Questions connexes