java-Spring和AOP:@After有效,但@AfterReturning无效

在一个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 advice runs when a matched method execution returns normally

上一篇:春季-是否可以为动态实例化的类编织一个方面?


下一篇:java-将Ajc编译器与Spring问题AspectJ一起使用