blah
blah

Reputation: 937

Spring AOP Pointcut if condition

I am facing an issue with pointcuts, I am trying to enable the @Around when the log.isDebugEnabled is true for this I am trying the following code:

@Pointcut("within(org.apache.commons.logging.impl.Log4JLogger..*)")
    public boolean isDebugEnabled() {
        return log.isDebugEnabled();
    }

and for testing purposes, I have two aspects configured

@AfterThrowing(value = "!isDebugEnabled()", throwing = "exception")

and

@Around(value = "isDebugEnabled()")

But all the times when I try to execute the code it always goes to @AfterThrowing, and it is not clear for me what I am doing wrong!

I am using aspectJWeaver 1.8.9, with Spring MVC 4.3!

Here is a sample class emulating the issue:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

@Component
@Aspect
public class SampleAspect {

    private static final Log log = LogFactory.getLog(SampleAspect.class);

    @Pointcut("within(org.apache.commons.logging.impl.Log4JLogger..*)")
    public boolean isDebugEnabled() {
        return log.isDebugEnabled();
    }

    @AfterThrowing(value = " !isDebugEnabled()", throwing = "exception")
    public void getCalledOnException(JoinPoint joinPoint, Exception exception) {

        log.error("Method " + joinPoint.getSignature() + " Throws the exception " + exception.getStackTrace());
    }

    //Never execute around method even when log.isDebugEnabled() = true
    @Around(value = "isDebugEnabled()")
    public Object aroundTest(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        final Object proceed;
        try {
            proceed = proceedingJoinPoint.proceed();
        } catch (Exception e) {
            throw e;
        }
        stopWatch.stop();
        log.debug("It took " + stopWatch.getTotalTimeSeconds() + " seconds to be proceed");

        return proceed;
    }
}

edit, I tried to use if() from aspectJ, but it didn't work in my project either.

@Pointcut("call(* *.*(int)) && args(i) && if()")
     public static boolean someCallWithIfTest(int i) {
        return i > 0;
     }

Not sure if I need to add a different import or so, but I didn't manage to make it work.

Upvotes: 1

Views: 2346

Answers (1)

R.G
R.G

Reputation: 7131

Couple of points from documentation

== Spring AOP Capabilities and Goals

Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans)

=== Declaring a Pointcut

In the @AspectJ annotation-style of AOP, a pointcut signature is provided by a regular method definition, and the pointcut expression is indicated by using the @Pointcut annotation (the method serving as the pointcut signature must have a void return type).

Apache commons classes are not managed by Spring container . So the following will not be honoured.

@Pointcut("within(org.apache.commons.logging.impl.Log4JLogger..*)")

Following pointcut method is not valid

public boolean isDebugEnabled() {
        return log.isDebugEnabled();
    }

Upvotes: 0

Related Questions