2014-01-16 40 views
0

我想创建多个AfterThrowing通知机制,它基于方法抛出异常的类型。它没有被调用。以下是代码片段:AfterThrow基于异常类型的建议

@Component 
@Configuration 
@EnableAspectJAutoProxy 
@Aspect 
public class ExceptionAspect { 

    @Pointcut("within(sampleapp.config.*)") 
    public void allInitializationMethods() { 
    } 

    @AfterThrowing(pointcut="allInitializationMethods()",throwing="ex") 
    public void allInitializationMethodsBefore(FatalInitializationException ex) { 
     System.out.println("Point cut executed"); 
    } 

    @AfterThrowing(pointcut="allInitializationMethods()",throwing="ex") 
    public void allInitializationMethodsBefore(RetryToRecoverException ex) { 
     System.out.println("Point cut executed"); 
    } 
} 
+0

尝试在其中的一个改变参数的名称。从“前”可能是'ex1'? –

回答

0

这对我来说很漂亮。我认为你的配置中唯一缺少的部分是@ComponentScan。但我相信这将是你的配置类,因此没有打扰太多。 如果你还没有添加@ComponentScan,那根本不会加载你的方面。

这是我的AppConfig类。

@Configuration 
@ComponentScan("com.stackoverflow.aopquestion") 
@EnableAspectJAutoProxy 
public class AppConfig { 

} 

我的主类

public class ApplicationMain { 

    public static void main(final String[] args) { 
     final AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(AppConfig.class); 
     // appContext.scan("com.stackoverflow.aopquestion"); 
     // appContext.refresh(); 
     final FatalAppExceptionGenerator exGen = (FatalAppExceptionGenerator) appContext 
      .getBean("fatalappExceptionGenerator"); 
     try { 
     exGen.throwingFatalApp(); 
     } 
     catch (final FatalApplicationError e) { 
     // TODO Auto-generated catch block 
     // e.printStackTrace(); 
     } 

    } 

} 

最后我的方面

@Component 
@Aspect 
public class AnAspect { 

    @Pointcut(value = "within(com.stackoverflow.aopquestion.*)") 
    public void allExceptionPointcuts() { 

    } 

    @AfterThrowing(value = "allExceptionPointcuts()", throwing = "ex") 
    public void doCheck(final FatalApplicationError ex) { 
     System.out.println("Invoked the afterthrowing aspect"); 
     // ex.printStackTrace(); 
    } 

    @Before(value = "within(com.stackoverflow.aopquestion.FatalAppExceptionGenerator+) && execution(* throwingFatalApp(..))") 
    public void doValidate(final JoinPoint jp) { 
     System.out.println("Invoking before advice"); 
    } 

} 

这里是输出。

Jan 20, 2014 1:31:32 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing org.spring[email protected]3a6af2fb: startup date [Mon Jan 20 13:31:32 IST 2014]; root of context hierarchy Jan 20, 2014 1:31:32 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO: Pre-instantiating singletons in org.s[email protected]418f12dc: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,appConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,anAspect,fatalappExceptionGenerator,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy 

调用之前建议调用afterthrowing方面