2011-02-07 9 views
12

estoy usando aspectj para interceptar los métodos que están anotados con @Profile(description="something")pointcut aspectj con la anotación de los parámetros

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Profile { 
    public String description() default ""; 
} 

@Around("com.merc.aop.ctw.aspect.PointcutDefinitions.logAnnotatedMethods(profile)") 
public Object profile(ProceedingJoinPoint pjp, Profile profile) throws Throwable { 
    .... 
} 

@Pointcut("@annotation(com.merc.annotations.Profile)") 
protected void logAnnotatedMethods(Profile profile) { 
} 

pero me da el siguiente error msg mientras compileing usando AJC

formal unbound in pointcut 
+0

Hola, mi requisito es el mismo que el tuyo. Tengo una duda de lo que es 'com.merc.aop.ctw.aspect.PointcutDefinitions.logAnnotatedMethods'. Noté que logAnotatedMethods que ha creado pero no obtengo lo que es com.merc.aop.ctw.aspect.PointcutDefinitions? Por favor guíame. – James

Respuesta

14
@Pointcut("@annotation(com.merc.annotations.Profile)") 
protected void logAnnotatedMethods(Profile profile) { 
} 

Esto no es correcto, @annotation() quiere un nombre de parámetro, no un tipo de parámetro.

Si su clase está compilada con código de depuración, el parámetro de punto debe tener el mismo nombre que el parámetro de método; si no, debe confiar en que los tipos de parámetro son únicos o escribir explícitamente los nombres de parámetro usando argNames parámetro:

@Pointcut(value="@annotation(profile)",argNames="profile") 
protected void logAnnotatedMethods(Profile arg) { } 

Referencia:

+0

No estoy de acuerdo. Simplemente utilicé @annotation con un tipo de anotación como parámetro y funciona como un amuleto en Spring 3.1 justo como los documentos dicen que debería ser. http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/aop.html –

+1

En realidad, los documentos especifican ambas versiones. Encontrará mi versión en esta sección: http://static.springsource.org/spring/docs/3.0.3.RELEASE/spring-framework-reference/html/aop.html#aop-ataspectj-advice-params. Sin embargo, no estaba al tanto de la otra versión. –

+1

Pero luego: esta es una pregunta de AspectJ, no una pregunta de Spring AOP, por lo que los documentos de Spring son poco relevantes. Pero tomé esto del libro AspectJ en acción: '@annotation (TypePattern u ObjectIdentifier)' que nuevamente muestra que ambos estamos en lo cierto, al igual que en Spring AOP –

5

que estaba jugando y encontró que el siguiente trabajó

@Pointcut("@annotation(profile)") 
protected void logAnnotatedMethods(Profile profile) { 
} 
Cuestiones relacionadas