2013-01-22 53 views
7

我AMS使用Spring 2.5.6,1.5.3 ASM,aspectjrt/aspectjweaver 1.6.1,CGLIB 2.1_3 在我的基於Web的Spring應用程序我有以下類:的Spring AOP(寬)不執行

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 =================="); 
    } 
} 

我有一個Controller:uk.co.txttools.web.controller.compose.PreviewMessageController which has onSubmit()method, which get called from web page. I have separate applicationContext.xml`文件。

springapp-servlet.xml(在web.xml文件中使用org.springframework.web.servlet.DispatcherServlet)文件是這樣的:

<?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" /> 
. 
. 

低於同一XML文件PreviewMessageController得到初始化,這意味着我的控制器和看點生活是相同的容器。

我在運行應用程序時沒有遇到任何異常,但我的方面類LoggingAspect永遠不會被調用。 我不確定那是什麼錯過或我做錯了。 請幫助我..

感謝

回答

8

終於解決了它。

我想我缺少aspectj-maven-plugin。它需要春天來編織各個方面。儘管沒有教程提供這些信息。添加以下到我的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> 

謝謝你們

+1

不,該插件不需要編織Spring AOP方面,只有當你想使用完整的AspectJ加載時編織或編譯時編織。你所做的就是使用CTW。真正的修復將會是修復你的Spring AOP配置。 – kriegaex

0

在您的配置文件試試這個:

<aop:aspectj-autoproxy proxy-target-class="true"> 
    <aop:include name="loggingAspect"/> 
</aop:aspectj-autoproxy> 
+0

它仍然無法正常工作,我仍然得到也不例外,但我的方面永遠不會打電話。我認爲我的控制器沒有代理,因此AOP將無法工作。我認爲在路徑中使用cglib並且會解決這個問題,但不知道缺少什麼? – bhavin

+0

檢查我的其他答案爲基於xml的配置.. – Vikram

1

如果你還沒有嘗試過...嘗試基於XML的彈簧AOP配置如下:

<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" /> 
+0

感謝您的回覆Vikram,但我也嘗試過,即使基於XML的配置不起作用。我認爲Cglib無法爲我生成代理。任何意見在那? – bhavin

+0

@ bhavin.patel我認爲你用'proxy-target-class =「true」'完成的工作應該符合你的目的...我認爲問題可能與aspectjrt和aspectjweaver jar文件有關......我使用Spring 3.0使用aspectjrt和aspectweaver版本1.6.8。如果你的項目是基於Maven的,並且你不介意升級到Spring 3。0你可以快速交換和檢查.. – Vikram

+0

甚至更​​好,如果你可以換出你的代碼中的cglib依賴關係,並檢查它是否適用於Spring 2.5/AspectJ 1.5.3。如果您使用的是Spring IDE,那麼您將在所有方法上都有標記,這些方法將被建議......這樣,至少您可以瞭解一些方面是否已經編譯好...... – Vikram

13

我不知道如果我這樣做是正確的,但對我來說有什麼解決它添加@Component到「Aspect'ed」類 -

@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; 
    } 
} 

(和只是爲了關閉循環 - 如果您使用基於註釋的標記,請不要忘記將@EnableAspectJAutoProxy添加到您的配置類。

@EnableAspectJAutoProxy 
+0

我想知道爲什麼這不是在文檔中更清楚。它也解決了我的問題。 – idipous

3

對於那些誰選擇了JavaConfig,你可以宣佈你的Aspect作爲一個bean,並添加註釋@EnableAspectJAutoProxy開啓自動代理:

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