Spring和AOP:@After工作但不是@AfterReturning

时间:2013-05-13 12:57:13

标签: java spring aspectj aop

在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建议没有做任何事情:(

有什么想法吗?谢谢!

1 个答案:

答案 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通知在匹配的方法执行正常返回时运行