2008-09-02 20 views
7

Mon projet est basé sur spring framework 2.5.4. Et j'essaie d'ajouter des aspects pour certains contrôleurs (j'utilise aspectj 1.5.3).Aspectj n'attrape pas tous les événements dans le cadre de printemps?

J'ai activé proxy automatique en application servlet.xml, juste ces lignes collées à la fin du fichier xml:

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

aspect Créé:

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

Mes contrôleurs: Lorsque je définis des points de freinage dans les conseillers d'aspect et que j'appelle des contrôleurs, je ne saisis qu'handleRequest() mais pas afterRebildThumbnail() Qu'est-ce que j'ai fait de mal?

NOTE

Je pose cette question au nom de mon ami qui n'a pas accès à SO bêta, et je n'ai pas la moindre idée de quoi il est question.

EDIT

Il y avait en effet quelques fautes d'orthographe, merci Cheekysoft. Mais le problème persiste encore.

Répondre

2

Vos points d'arrêt ne sont pas touchés parce que vous utilisez AOP proxies de printemps. Voir understanding-aop-proxies pour une description de la façon dont les proxies AOP sont spéciaux. Fondamentalement, le framework MVC va appeler la méthode handleRequest sur le proxy de votre controller (que par exemple le MultiActionController que vous utilisez en tant que classe de base implémente), cette méthode fera alors un appel "interne" à sa rebuildThumbnail méthode, mais cela ne passera pas par le proxy et ne prendra donc aucun aspect. (Ceci n'a rien à voir avec les méthodes étant finale.)

Pour réaliser ce que vous voulez, étudiez en utilisant le "vrai" AOP via le tissage du temps de chargement (que Spring supporte très bien).

0

Est-ce aussi simple que l'orthographe? ou y a-t-il juste des fautes de frappe dans la question? vous écrire Parfois rebuildThumbnail et parfois vous écrire rebildThumbnail

Les méthodes que vous essayez de passer outre des conseils ne sont pas des méthodes finales dans le framework MVC, donc tout bpapas réponse est utile, je crois comprendre que ce n'est pas le problème dans ce Cas. Cependant, assurez-vous que l'action rebuildThumbnail du contrôleur n'est pas définitive

@bpapas: corrigez-moi si je me trompe. L'action du contrôleur du programmeur est ce qu'il essaie de contourner. En regardant la source MultiActionController (et celle de ses parents), la seule méthode finalisée potentiellement dans la pile est MultiActionController.invokeNamedMethod, bien que je ne sois pas sûr à 100% si cela serait dans la pile à ce moment-là ou pas. Le fait d'avoir une méthode finalisée plus haut dans la pile pose-t-il un problème en ajoutant des conseils AOP à une méthode plus éloignée?

1

La configuration de base semble correcte.

La syntaxe peut être légèrement simplifiée en ne définissant pas un point-point en place et en spécifiant simplement la méthode à laquelle le post-conseil doit être appliqué. (Les raccourcis nommés pour les méthodes sont automatiquement créés pour vous.)

Par exemple.

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

Tant que la méthode rebuildThumbnail est pas définitive, et le nom de la méthode et la classe sont corrects. Je ne vois pas pourquoi cela ne marchera pas.

voir http://static.springframework.org/spring/docs/2.0.x/reference/aop.html