Spring AOP (Aspect) Not executing

34,330

Solution 1

Finally SOLVED it.

I think I was missing aspectj-maven-plugin. It required for spring to weaving of aspects. None tutorial provide this information though. Added following to my pom.xml.

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outxml>true</outxml>
        <verbose>true</verbose>
        <showWeaveInfo>true</showWeaveInfo>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>

Thanks guys

Solution 2

I'm not sure if I did it properly but for me what solved it was adding @Component to the "Aspect'ed" class -

@Aspect
@Component
public class PerformanceLogger {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Around("within(com.something.rest.service..*)")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object retVal = pjp.proceed();
        long end = System.currentTimeMillis();
        logger.debug(pjp.getSignature().toShortString() + " Finish: " + (end - start) + "ms");
        return retVal;
    }
}

(And just to close the loop - if you are using annotation based, don't forget adding @EnableAspectJAutoProxy to your Config class.

@EnableAspectJAutoProxy

Solution 3

For those who opted for JavaConfig, you can declare your Aspect as a bean and add the @EnableAspectJAutoProxy annotation to turn on auto-proxying :

@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class MyConfig {
    @Bean
    public LoggingAspect loggingAspect(){
        return new LoggingAspect();
    }
}

Solution 4

If you havent tried already...try the xml based spring-aop configuration as follows:

    <aop:config>
    <aop:aspect ref="loggingAspect">
        <aop:pointcut expression="execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))" id="previewMessageControllerSetters"/>
        <aop:before method="setLoggingAdvice" pointcut-ref="previewMessageControllerSetters"/>

         // set other 2 pointcuts similarly....
        </aop:aspect>       
    </aop:config>
    <bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />

Solution 5

Only to make the list of possible answers complete:

To me it looks like you are missing the following dependency in your maven pom.xml:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>2.5.6</version>
</dependency>
Share:
34,330
bhavin
Author by

bhavin

Updated on May 14, 2020

Comments

  • bhavin
    bhavin about 4 years

    I ams using Spring 2.5.6, asm 1.5.3, aspectjrt/aspectjweaver 1.6.1, cglib 2.1_3 In my Web based Spring application I have following class:

    package uk.co.txttools.aspects;
    
    @Aspect
    public class LoggingAspect {
        @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))")
        public void setLoggingAdvice(){
            System.out.println("********************************* Advice run..... set mothod called....");
        }
    
        @AfterThrowing("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
        public void hadleException(){
           System.out.println("================= PreviewMessageController =========== ON SUBMIT Exception Throwen ==================");
        }
    
        @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)")
        public void OnSubmitAspect(){
            System.out.println("================= PreviewMessageController =========== ON SUBMIT CALLED ==================");
        }
    }
    

    I have one Controller:uk.co.txttools.web.controller.compose.PreviewMessageController which hasonSubmit()method, which get called from web page. I have separateapplicationContext.xml` file.

    My springapp-servlet.xml(which is used in web.xml file with org.springframework.web.servlet.DispatcherServlet) file looks like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
    
    <aop:aspectj-autoproxy proxy-target-class="true" />
    
    <bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" />
    .
    .
    

    Below in same xml file PreviewMessageController get initialize which means my Controller and Aspect live is same container.

    I don't get any exception while running application but my aspect class LoggingAspect never get called. I'm not sure what is that missing or I'm doing wrong. Please help me..

    Thanks

  • bhavin
    bhavin over 11 years
    It still doesn't work, I still get no exception but my aspect never get called. I think my Controller is not getting proxied hence AOP won't work. I thought having cglib in path and have <aop:auto-proxy/> would solve this issue but not sure what's missing ?
  • bhavin
    bhavin over 11 years
    Thanks for your reply Vikram but I have tried that too, even XML based configuration doesn't work. I think Cglib is not be able to generate proxy for me. Any advise in that ????
  • Vikram
    Vikram over 11 years
    @bhavin.patel I think what you had done with proxy-target-class="true" should have served your purpose...I think the problem may be with aspectjrt and aspectjweaver jar files...I use Spring 3.0 with aspectjrt and aspectweaver version 1.6.8. If your project is Maven based and if you dont mind upgrading to Spring 3.0 you could quickly swap and check..
  • Vikram
    Vikram over 11 years
    or even better if you can swap out cglib dependencies in your code and check if it works for Spring 2.5/ AspectJ 1.5.3. If you are using Spring IDE then you would have markers on all your methods that would be advised... this way atleast you can get some idea if your aspects are even getting compiled...
  • kriegaex
    kriegaex about 7 years
    No, that plugin is not needed for weaving Spring AOP aspects, only if you want to use full AspectJ load-time weaving or compile-time weaving. What you did was to use CTW. The real fix would have been to fix your Spring AOP configuration.
  • idipous
    idipous almost 7 years
    I wonder why this is not clearer in the documentation. It fixed my problem as well.
  • Victor
    Victor over 5 years
    @idipous I believe that the documentation that clears this out is link: You may register aspect classes as regular beans in your Spring XML configuration, or autodetect them through classpath scanning - just like any other Spring-managed bean. However, note that the @ Aspect annotation is not sufficient for autodetection in the classpath: For that purpose, you need to add a separate @ Component annotation...
  • Victor
    Victor over 5 years
    @Arpit In short, @ Aspect is not a Spring annotation but an AspectJ one. That is why you need to mark the aspect you create as a Spring component by adding Spring specific annotations.
  • Ar3s
    Ar3s over 3 years
    @Inject is not a Spring specific annotation either but spring recognizes it. They could (really should if you ask me) have gone the extra-mile of having (@)Aspect Behave as a (@)Compenent once you load the spring-aop or spring-aspects lib ...