Intercepting method with Spring AOP using only annotations

annotations, java, spring, spring-aop

Solution

Have you enabled annotation-based AOP? The documentation says you have to add

<aop:aspectj-autoproxy/>

to your spring configuration. Then you need to add an annotation in front of your `checkUser` method. It looks like you want `@Around` advice, as described here.

@Aspect
public class UserExistsCheck {

  @Around("execution(* a.b.c.d.*.*(..)) && args(a.b.c.d.RequestObject)")
  public Object checkUser(ProceedingJoinPoint pjp) throws Throwable {

Problem

In my Spring context file I have something like this: ``` <bean id="userCheck" class="a.b.c.UserExistsCheck"/> <aop:config> <aop:aspect ref="userCheck"> <aop:pointcut id="checkUser" expression="execution(* a.b.c.d.*.*(..)) &amp;&amp; args(a.b.c.d.RequestObject)"/> <aop:around pointcut-ref="checkUser" method="checkUser"/> </aop:aspect> </aop:config> ``` a.b.c.UserExistsCheck looks like this: ``` @Aspect public class UserExistsCheck { @Autowired private UserInformation userInformation; public Object checkUser(ProceedingJoinPoint pjp) throws Throwable { int userId = ... //get it from the RequestObject passed as a parameter if (userExists(userId)) { return pjp.proceed(); } else { return new ResponseObject("Invalid user); } } ``` And the class that is being intercepted with this stuff looks like this: ``` public class Klazz { public ResponseObject doSomething(RequestObject request) {...} } ``` This works. UserExistCheck is executed as desired before the call is passed to Klazz. The problem is that this is the only way I got it working. To get this working by using annotations instead of the context file seems to be just too much for my small brain. So... how exactly should I annotate the methods in UserExistsCheck and Klazz? And do I still need something else too? Another class? Still something in the context file?

Original source