Spring AOP (Aspect) Not executing
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>
bhavin
Updated on May 14, 2020Comments
-
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 has
onSubmit()method, which get called from web page. I have separate
applicationContext.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 over 11 yearsIt 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 over 11 yearsThanks 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 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 over 11 yearsor 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 about 7 yearsNo, 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 almost 7 yearsI wonder why this is not clearer in the documentation. It fixed my problem as well.
-
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 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 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 ...