Aspectj non cattura tutti gli eventi nella primavera del quadro?
-
09-06-2019 - |
Domanda
Il mio progetto è basato sul framework spring 2.5.4.E cerco di aggiungere aspetti per alcuni controller (io uso aspectj 1.5.3).
Ho abilitato il proxy automatico in application-servlet.xml, appena incollate queste righe alla fine del file xml:
<aop:aspectj-autoproxy />
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" />
Creata aspetto:
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");
}
}
Il mio controller:
class AssetAddController implements Controller
class AssetThumbnailRebuildController extends MultiActionController
Quando ho impostato il freno punti in aspetto consulenti e richiamare controller prendo solo afterHandleRequest() ma non afterRebildThumbnail() Cosa ho fatto di sbagliato?
NOTA
Mi sto chiedendo questa domanda per conto di un mio amico che non ha accesso alla beta COSÌ, e non ho idea di cosa si sta parlando.
MODIFICA
C'erano alcuni errori di ortografia, grazie Cheekysoft.Ma il problema ancora persiste.
Soluzione
I punti di interruzione non essere colpiti, perché si sta utilizzando Spring AOP Proxy.Vedere comprensione-aop-proxy per una descrizione di come AOP Deleghe speciali.
Fondamentalmente, il framework MVC è chiamare il handleRequest
metodo del controller proxy (che per esempio l' MultiActionController
si utilizza come base di classe implementa), questo metodo poi fare un "interno" chiamata per la sua rebuildThumbnail metodo, ma questo non passare attraverso il proxy e quindi non prendere qualsiasi altro aspetto.(Questo non ha nulla a che fare con i metodi finale.)
Per ottenere ciò che si vuole, indagare tramite "reale" AOP via il tempo di caricamento di tessitura (che in Primavera supporta molto bene).
Altri suggerimenti
AspectJ non funziona bene con le classi nella Primavera del Web framework MVC. Leggere il fondo di "Aperto per estensione..." la finestra sul lato destro della pagina
Invece, date un'occhiata al HandlerInterceptor l'interfaccia.
Il nuovo Spring MVC Annotazioni possono lavorare e da allora le classi Controller sono tutti Pojo, ma non ho provato io stesso.
La configurazione di base sembra ok.
La sintassi può essere semplificato leggermente da non definire un pointcut e di specificare il metodo di cui il dopo-consulenza deve essere applicato.(Il nome pointcuts per i metodi che vengono creati automaticamente per voi.)
ad es.
@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" );
}
Fintanto che la rebuildThumbnail metodo non è definitivo, e il nome del metodo e la classe sono corrette.Non vedo perché questo non funziona.
vedere http://static.springframework.org/spring/docs/2.0.x/reference/aop.html
Questo è semplice come l'ortografia?o ci sono solo errori di battitura in questione?A volte si scrive rebuildThumbnail
e a volte si scrive rebildThumbnail
I metodi che si sta tentando di ignorare i consigli non sono definitivi metodi del framework MVC, così, mentre bpapas risposta è utile, la mia comprensione è che questo non è il problema in questo caso.Tuttavia, è bene accertarsi che la rebuildThumbnail
controller di azione non è ancora definitivo
@bpapas:per favore mi corregga se sbaglio.Il programmatore propria azione controller è quello che sta cercando di ignorare.Guardando il MultiActionController origine (e dei genitori) il solo finalizzati metodo potenzialmente in stack MultiActionController.invokeNamedMethod
, anche se non sono sicuro al 100% se questo sarebbe nello stack in quel momento o non.Il possesso di un metodo finalizzato superiore dello stack causa di un problema di aggiunta AOP consigli per un metodo più in basso?