在一个Web应用程序中,我使用Spring AOP来检查我的服务对传入呼叫的授权,并管理返回结果时的消息(信息,警告,错误)。使用方面来节省我的代码行并概括了我的服务的行为(它看起来很性感^^)。
所以我的应用程序上下文中有这种类型的conf
<aop:aspectj-autoproxy />
<bean id="authenticationCheckAspect" class="fr.test.server.business.aspect.AuthenticationCheckAspect" />
我的表情看起来像这样:
package fr.test.server.business.aspect;
@Aspect
public class AuthenticationCheckAspect {
private static final Logger LOG = LoggerFactory.getLogger(AuthenticationCheckAspect.class);
@Autowired
private AuthenticationBiz authBiz;
/**
* methodAnnotatedWithMyService Pointcut
*/
@Pointcut("execution(@fr.test.server.business.aspect.MyService * *(..))")
public void methodAnnotatedWithMyService() {
// Méthode vide servant de Pointcut
}
@Before("methodAnnotatedWithMyService()")
public void checkAuthentication(final JoinPoint joinPoint) throws FunctionalException {
LOG.debug("checkAuthentication {}", joinPoint);
{process...}
}
@AfterReturning(pointcut = "methodAnnotatedWithMyService()", returning = "result")
public void manageErrors(final JoinPoint joinPoint, final Object result) {
LOG.debug("Returning {}", joinPoint);
}
}
在执行任何标记了
@MyService
的方法之前,应该先触发checkAuthentication()
方法,这是:)可以了。在执行任何标记了
@MyService
的方法之后,应该也触发该方法manageErrors,但它不会:(请注意,对于@After
,它可以工作,但我绝对需要@MyService
注释方法的返回值,这就是为什么我需要@AfterReturning
。由于我的
@Before
建议有效(尝试时也包括@After
),我想我没有代理类之类的问题,否则不会发生其他任何事情,但我真的不明白为什么不调用@AfterReturning
建议。注意:执行通话时不会出现任何错误。只是我的
@AfterReturning
建议没有做任何事情:(任何想法 ?谢谢 !
最佳答案
您的代码看起来不错。
我建议添加
@AfterThrowing(pointcut = "methodAnnotatedWithMyService()", throwing="ex")
public void doRecoveryActions( Exception e) {
// Some code may be System.out.println
// or e.printStackTrace()
}
看看是否正在执行。
如果切入点
methodAnnotatedWithMyService()
内抛出异常,则不会调用@AfterReturning
。但是会调用@After
。来自http://static.springsource.org/spring/docs/2.0.x/reference/aop.html
当匹配的方法执行正常返回时,@ AfterReturning建议运行