2011-05-04 88 views
0

該方法不捕獲的方法traceWhenReturnedValueDoesntExistOrNotNecessary方法DefaultProduitGeneriqueService.valider,我不明白爲什麼?AOP Spring之前建議不工作

package fr.generali.nova.atp.service.metier.impl; 

public class DefaultProduitGeneriqueService extends DefaultService implements IProduitGeneriqueService, IBacAware { 

... 

@Override 
@Traceable(value = ETraceableMessages.VALIDATION_PRODUIT_GENERIQUE, hasReturnedValue=Traceable.HAS_NOT_RETURNS_VALUE) 
public void valider(ElementNiveauUn element) { 
    ... 
} 
... 
} 

package fr.generali.nova.atp.logging.advisor; 


@Aspect 
public class TraceableAdvisor { 

    @Before(value = "execution(* fr.generali.nova.atp.service.metier.impl.*.*(..)) && @annotation(traceable) && args(element)", argNames = "element,traceable") 
    public void traceWhenReturnedValueDoesntExistOrNotNecessary(ElementNiveauUn element, Traceable traceable) { 
     ... 
    } 

} 
+0

是'DefaultProduitGeneriqueService'一個Spring bean? Spring AOP只能應用於bean。 – 2011-05-04 18:28:45

+0

DefaultProduitGeneriqueService是一個bean – leplusfaible 2011-05-05 13:42:46

回答

0

確保通過註釋或在您的appCtx中正確配置了兩個豆。

看起來你的看點絕對正確,但其他班級呢?它是否啓用了Spring?另外,如果兩個類的配置都是正確的,你確定傳入的實例是一個Spring bean,而不是來自構造函數的「新」實例嗎?

+1

還要確保bean的aspect-annotated方法總是通過Spring提供的句柄來訪問,並且永遠不會通過this。 (或切換到使用完整的AspectJ,它使用字節代碼mods代替使用代理。) – 2011-05-06 09:43:24

0

假設服務接口在包fr.generali.nova.atp.service.metier.api

package fr.generali.nova.atp.service.metier.api; 

public interface IProduitGeneriqueService { 

    void valider(ElementNiveauUn element); 
} 

,服務實現在包fr.generali.nova.atp.service.metier.impl

package fr.generali.nova.atp.service.metier.impl; 

public class DefaultProduitGeneriqueServiceImpl implements IProduitGeneriqueService { 

    @Override 
    @Traceable(value = ETraceableMessages.VALIDATION_PRODUIT_GENERIQUE, hasReturnedValue=Traceable.HAS_NOT_RETURNS_VALUE) 
    public void valider(ElementNiveauUn element) { 
     // TODO: implement 
    } 
} 

你的方面應該是這樣的:

package fr.generali.nova.atp.logging.advisor; 

@Aspect 
public class TraceableAdvisor { 

    @Before(value = "execution(* fr.generali.nova.atp.service.metier.api.*.*(..)) && @annotation(traceable) && args(element)", argNames = "element,traceable") 
    public void traceWhenReturnedValueDoesntExistOrNotNecessary(ElementNiveauUn element, Traceable traceable) { 
     // TODO: implement 
     System.err.println("traced..."); 
    } 
} 

對Spring AOP默認代理策略是JDK基於接口的代理,所以你的切入點表達式應該匹配接口方法執行,而不是實現方法執行,和你的poincut表達式可以匹配任何一種接口評判執行或實施方法執行。

並記住在您的配置中包含AspectJAutoProxyCreator,例如使用<aspectj-autoproxy />標記。

這裏是一個簡單的測試,以證明everyting工作:

public class TraceableAdvisorTest { 

    @Configuration 
    public static class TestConfiguration { 

     @Bean 
     public IProduitGeneriqueService produitGeneriqueService() { 
      return new DefaultProduitGeneriqueServiceImpl(); 
     } 

     @Bean 
     public TraceableAdvisor traceableAdvisor() { 
      return new TraceableAdvisor(); 
     } 

     @Bean 
     public AnnotationAwareAspectJAutoProxyCreator autoProxyCreator() { 
      return new AnnotationAwareAspectJAutoProxyCreator(); 
     } 
    } 

    private AnnotationConfigApplicationContext testApplicationContext; 

    @Test 
    public void testTraceWhenReturnedValueDoesntExistOrNotNecessary() { 
     this.testApplicationContext = new AnnotationConfigApplicationContext(); 
     this.testApplicationContext.register(TestConfiguration.class); 
     this.testApplicationContext.refresh(); 

     IProduitGeneriqueService service = BeanFactoryUtils.beanOfType(this.testApplicationContext, IProduitGeneriqueService.class); 

     System.err.println("BEFORE"); 
     service.valider(null); 
     System.err.println("AFTER"); 
    } 
} 

err輸出是:

BEFORE 
traced... 
AFTER 

對於所有組合:

  • fr.generali.nova.atp.service.metier.api.*.*(..)
  • fr.generali.nova.atp.service.metier.impl.*.*(..)
  • fr.generali.nova.atp.service.metier..*.*(..)
+0

IProduitGeneriqueService位於fr.generali.nova.atp.service.api包中。我用@替換impl,像這樣@Before(value =「execution(* fr.generali.nova.atp.service.metier。*。*。*(..))&& @annotation(traceable)&& args(element )「,argNames =」element,traceable「) – leplusfaible 2011-05-05 13:41:29

+0

但dosnt仍然工作:( – leplusfaible 2011-05-05 13:42:23

+0

所以在你的情況下它應該是:'執行(* fr.generali.nova.atp.service。metier.api .. *。*(..)) - 表示每個類的任何子包中的每個類(第一個:'。*')的每個方法的執行(這個部分:'。*(..)') fr.generali.nova.atp.service.metier.api'(該部分:'fr.generali.nova.atp.service.metier.api..' - **注意最後雙點**)。 – Roadrunner 2011-05-06 07:57:39