2011-05-04 73 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