方法defaultWroduitGeneriqueService.valider没有被方法traceWhenReturnedValueDoesntExistOrNotNecessary捕获,我不明白为什么?
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 :(得分:0)
确保通过注释或appCtx
。
看起来你的Aspect绝对是正确的,但另一个类怎么样?是否启用了Spring?
此外,如果两个类确实配置正确,您确定传递的实例是Spring bean而不是构造函数中的“new”实例吗?
答案 1 :(得分: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表达式可以匹配接口mothod执行或实现方法执行。
请务必使用AspectJAutoProxyCreator
标记在您的配置中添加<aspectj-autoproxy />
。
这是一个简单的测试,以证明每一个工作:
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..*.*(..)