2008-11-05 22 views
6

Estoy usando AspectJ para asesorar a todos los métodos públicos que sí tienen un argumento de una clase elegida. He intentado lo siguiente:AspectJ: parámetro en un corte de punto

Esto está funcionando de maravilla para los métodos con al menos 2 argumentos:

public void delete(Object item, Session currentSession); 

pero no funciona con métodos como:

public List listAll(Session currentSession); 

¿En qué puedo cambiar mi punto de corte para asesorar a ambos métodos de ejecuciones? En otras palabras: esperaba que el comodín ".." representara "cero o más argumentos", pero parece que significa "uno o más" ...

Respuesta

7

Oh bien ... trabajé eso con este truco desagradable Todavía estoy esperando que alguien aparezca con una definición de punto de corte "oficial".

pointcut permissionCheckMethods(EhealthSession eheSess) : 
    (execution(public * *(.., EhealthSession)) && args(*, eheSess)) 
    && !within(it.___.security.PermissionsCheck); 

pointcut permissionCheckMethods2(EhealthSession eheSess) : 
    (execution(public * *(EhealthSession)) && args(eheSess)) 
    && !within(it.___.security.PermissionsCheck) 
    && !within(it.___.app.impl.EhealthApplicationImpl); 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 

before(EhealthSession eheSess) throws AuthorizationException : permissionCheckMethods2(eheSess) 
{ 
    Signature sig = thisJoinPointStaticPart.getSignature(); 
    check(eheSess, sig); 
} 
4

¿Qué tal:

pointcut permissionCheckMethods(Session sess) : 
(execution(public * *(..)) && args(.., sess)); 

supongo que esto coincidirá si último (o único) argumento es de tipo de sesión. Al intercambiar las posiciones de args también puede coincidir primero o solo. Pero no sé si es posible combinar cualquier posición arbitraria.

+0

que coinciden con cualquier posición arbitraria no es posible. –

3

No puedo extender la sintaxis de AspectJ por ti, pero puedo ofrecerte una solución alternativa. Pero primero permítame explicar por qué no es posible hacer lo que quiera con una definición args en un corte de punto: porque si hace coincidir su parámetro EhealthSession en cualquier lugar dentro de la firma del método, ¿cómo debería manejar AspectJ el caso de que la firma contenga múltiples parámetros de ¿esa clase? El significado de eheSess sería ambiguo.

Ahora la solución: Puede ser más lento, cuánto depende de su entorno, simplemente pruébelo, pero podría hacer que el punto coincida con todos los métodos posibles independientemente de su lista de parámetros y luego deje que el consejo encuentre el parámetro que necesita mediante la inspección de la lista de parámetros:

pointcut permissionCheckMethods() : execution(public * *(..)); 

before() throws AuthorizationException : permissionCheckMethods() { 
    for (Object arg : thisJoinPoint.getArgs()) { 
     if (arg instanceof EhealthSession) 
      check(arg, thisJoinPointStaticPart.getSignature()); 
    } 
} 

PS: Tal vez se puede reducir el enfoque a través de within(SomeBaseClass+) o within(*Postfix)within(com.company.package..*) o para que no se aplique el asesoramiento a todo el universo.

2

usted tiene que utilizar .. (puntos dobles) al final y al comienzo de la siguiente manera:

pointcut permissionCheckMethods(Session sess) : 
    (execution(public * *(.., Session , ..))); 

también deshacerse fuera && args(*, sess) porque eso significa que usted espera para coger sólo aquellos métodos con cualquier tipo de primer param pero sess como segundo parámetro y no más de 2 parámetros también ..

+0

@Manrico Corazzi debe marcarlo como una solución a su problema. Para que otros no se desvíen de otras soluciones – Iomanip

Cuestiones relacionadas