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.

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top