在webapp中,我使用Spring AOP检查传入呼叫的服务授权,并在返回结果时管理消息(信息,警告,错误)。使用方面来节省我的代码行并概括我的服务行为(它看起来很性感^^)。
所以我在我的app环境中有这种类型的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
建议没有做任何事情:(
有什么想法吗?谢谢!
答案 0 :(得分:4)
您的代码看起来不错。 我建议添加
@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通知在匹配的方法执行正常返回时运行