2008-09-02 9 views
7

Mi proyecto se basa en Spring framework 2.5.4. Y trato de agregar aspectos para algunos controladores (uso aspectj 1.5.3).¿Aspectj no atrapa todos los eventos en el marco de primavera?

He permitido de proxy automático en aplicación servlet.xml, acaba de pegar estas líneas al final del archivo xml:

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

Creado aspecto:

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"); 
    } 
}

Mis controladores:

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

Cuando fijo puntos de freno en asesores de aspecto e invoco controladores de I solo con captura afterHandleRequest() pero no afterRebildThumbnail() ¿Qué hice mal?

NOTA

que estoy haciendo esta pregunta en nombre de mi amigo que no tiene acceso a SO beta, y no tienen ni idea de qué se trata.

EDITAR

En efecto, hubo algunas faltas de ortografía, gracias Cheekysoft. Pero el problema persiste.

Respuesta

2

Sus puntos de interrupción no se están viendo afectadas porque está utilizando proxies de primavera AOP. Consulte understanding-aop-proxies para obtener una descripción de cómo los Proxies AOP son especiales.

Básicamente, el framework MVC va a llamar al método handleRequest en el proxy de su controlador (que por ejemplo usa el MultiActionController que está utilizando como clase base), este método hará una llamada "interna" a su reconstrucción. método, pero esto no pasará por el proxy y por lo tanto no recogerá ningún aspecto. (Esto no tiene nada que ver con que los métodos sean definitivos.)

Para lograr lo que desea, investigue el uso de AOP "real" mediante el tiempo de carga (que Spring admite muy bien).

0

¿Esto es tan simple como la ortografía? o solo hay errores tipográficos en la pregunta? A veces se escribe rebuildThumbnail y en ocasiones se escribe rebildThumbnail

Los métodos que están tratando de anular con consejos no son métodos finales en el marco MVC, así que mientras bpapas respuesta es útil, mi opinión es que este no es el problema en este caso. Sin embargo, asegúrese de que la acción del controlador RebuildThumbnail no sea definitiva.

@bpapas: corríjame si me equivoco. La acción del controlador propia del programador es lo que intenta anular. Mirando el origen de MultiActionController (y sus padres), el único método finalizado potencialmente en la pila es MultiActionController.invokeNamedMethod, aunque no estoy 100% seguro de si esto estaría en la pila en ese momento o no. ¿Tener un método finalizado más arriba en la pila causa un problema al agregar el consejo de AOP a un método más abajo?

1

La configuración básica se ve bien.

La sintaxis se puede simplificar ligeramente al no definir un punto de corte en el lugar y simplemente especificar el método al que se debe aplicar el asesoramiento posterior. (Los puntos de corte nombrados para los métodos se crean automáticamente para usted)

p.

@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"); 
} 

Mientras el método rebuildThumbnail no es definitiva, y el nombre del método y la clase son correctos. No veo por qué esto no funcionará.

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

Cuestiones relacionadas