Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

aspectj pointcut with annotation parameters

Tags:

aspectj

I am using aspectj to intercept methods that are annotated with @Profile(description="something")

@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) {
}

But I get the following error msg while compileing using AJC

formal unbound in pointcut 
like image 549
user373201 Avatar asked Feb 07 '11 14:02

user373201


People also ask

What is pointcut annotation?

Pointcut is a set of one or more JoinPoint where an advice should be executed. You can specify Pointcuts using expressions or patterns as we will see in our AOP examples. In Spring, Pointcut helps to use specific JoinPoints to apply the advice.

What is pointcut in AspectJ?

AspectJ provides primitive pointcuts that capture join points at these times. These pointcuts use the dynamic types of their objects to pick out join points. They may also be used to expose the objects used for discrimination. this(Type or Id) target(Type or Id)

Which tag informs the Spring container about the use of AspectJ annotation?

Which tag informs the spring container about the use of AspectJ annotation? Explanation: To enable AspectJ annotation support in the Spring IoC container, you only have to define an empty XML element aop:aspectj-autoproxy in your bean configuration file.

What methods does this pointcut expression reference?

Pointcut is an expression language of spring AOP which is basically used to match the target methods to apply the advice. It has two parts ,one is the method signature comprising of method name and parameters. Other one is the pointcut expression which determines exactly which method we are applying the advice to.


2 Answers

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

This is not correct, @annotation() wants a parameter name, not a parameter type.

If your class is compiled with debug code, the pointcut parameter must have the same name as the method parameter, if not, you need to either rely on the parameter types being unique or explicitly write out your parameter names using the argNames parameter:

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

Reference:

  • @Pointcut javadocs
like image 112
Sean Patrick Floyd Avatar answered Oct 09 '22 13:10

Sean Patrick Floyd


I was playing around and found that the following worked

@Pointcut("@annotation(profile)")
protected void logAnnotatedMethods(Profile profile) {
}
like image 29
user373201 Avatar answered Oct 09 '22 15:10

user373201