2013-01-22 7 views
7

I AMS przy użyciu Wiosna 2.5.6 ASM 1.5.3, aspectjrt/aspectjweaver 1.6.1 cglib 2.1_3 W mojej aplikacji internetowej opartej na wiosennym Mam następujące klasy:Wiosną AOP (Aspect) niewykonanie

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

Mam jeden plik Controller:uk.co.txttools.web.controller.compose.PreviewMessageController which has onSubmit() method, which get called from web page. I have separate applicationContext.xml.

Moja springapp-servlet.xml (który jest używany w pliku web.xml z org.springframework.web.servlet.DispatcherServlet) plik wygląda tak:

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

Poniżej w samym pliku xml PreviewMessageController dostać zainicjować co oznacza, moim kontrolera a Aspect live to ten sam kontener.

Nie otrzymuję żadnego wyjątku podczas uruchamiania aplikacji, ale moja klasa aspektu LoggingAspect nigdy nie zostanie wywołana. Nie jestem pewien, co jest brakujące lub robię źle. Proszę mi pomóc ..

Dzięki

Odpowiedz

8

Wreszcie rozwiązał to.

Myślę, że brakowało aspektj-maven-plugin. Wymagało to wiosennego tkania aspektów. Jednak tutorial nie zawiera tych informacji. Dodano następujący po moim 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> 

Dzięki chłopaki

+1

Nie, ta wtyczka nie jest potrzebna do tkania Wiosenne aspekty AOP, tylko jeśli chcesz używać pełnego tasowania czasu działania AspektJ lub tasowania kompilacji. To co zrobiłeś, to użyć CTW. Naprawdę naprawiłbym twoją konfigurację Spring AOP. – kriegaex

0

Spróbuj w pliku konfiguracyjnym:

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

Nadal nie działa, ja wciąż nie wyjątek, ale mój wygląd nigdy nie zostaniesz wezwany. Myślę, że mój kontroler nie jest proxowany, dlatego AOP nie będzie działać. Myślałem, że mając cglib w ścieżce i rozwiąże ten problem, ale nie wiesz, czego brakuje? – bhavin

+0

Sprawdź moją drugą odpowiedź dla konfiguracji opartej na xml. – Vikram

1

Jeśli miałaś już próbowałem ... spróbuj opartą konfiguracji wiosna-AOP xml następująco:

<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

Dziękuję za odpowiedź Vikram ale też próbowałem, nawet konfiguracja oparta na XML nie działa. Myślę, że Cglib nie jest w stanie wygenerować dla mnie proxy. Wszelkie porady w tym ???? – bhavin

+0

@ bhavin.patel Myślę, że to, co zrobiłeś z 'proxy-target-class =" true "' powinno spełnić twoje zadanie ... Myślę, że problem może dotyczyć plików jar aspectjrt i aspectjweaver ... Używam Spring 3.0 z formatem aspectjrt i aspectweaver w wersji 1.6.8. Jeśli twój projekt jest oparty na Maven i nie przeszkadza ci przejście na Spring 3.0 możesz szybko zamienić i sprawdzić .. – Vikram

+0

lub jeszcze lepiej, jeśli możesz zamienić zależności cglib w swoim kodzie i sprawdzić, czy działa dla Spring 2.5/AspectJ 1.5.3. Jeśli używasz Spring IDE, będziesz miał markery na wszystkich swoich metodach, które byłyby zalecane ... w ten sposób możesz uzyskać pewien pomysł, jeśli twoje aspekty są nawet kompilowane ... – Vikram

13

Nie jestem pewien, czy zrobiłem to poprawnie, ale dla mnie było to, co rozwiązano dodając @Component do klasy "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; 
    } 
} 

(I aby zamknąć pętlę - w przypadku korzystania z adnotacji nie zapomnij o dodaniu @EnableAspectJAutoProxy do swojej klasy Config.

@EnableAspectJAutoProxy 
+0

Zastanawiam się, dlaczego nie jest to bardziej jasne w dokumentacji. Naprawił też mój problem. – idipous

3

Dla tych, którzy wybrali dla JavaConfig można zadeklarować swój Aspect jako fasoli i dodaj @EnableAspectJAutoProxy adnotacji, aby włączyć auto-proxy:

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