【问题标题】:AfterThrowing advice, delegate to serviceAfterThrowing建议,委托服务
【发布时间】:2021-09-17 08:53:10
【问题描述】:

我有这样的 aop xml 配置:

    <aop:config>
        <aop:pointcut id="serviceMethod" expression="execution(* egovframework.example..impl.*Impl.*(..))" />

        <aop:aspect ref="exceptionTransfer">
            <aop:after-throwing throwing="exception" pointcut-ref="serviceMethod" method="transfer" />
        </aop:aspect>
    </aop:config>
    
    <bean id="exceptionTransfer" class="bla.bla.DefaultExceptionTransfer">
    </bean>

可以看到&lt;aop:aspect ref="exceptionTransfer"&gt;这一行表示切面与下面的bean链接。

现在我想将其转换为基于 java 注释。我做了什么:

@Configuration
@Aspect
public class ContextExceptionHandlerAspectConfiguration {

    @Pointcut("execution(* egovframework.example..impl.*Impl.*(..))")
    public void serviceAnnotation() { }

    //HOW TO WRITE AFTER THROWING
    
    @Bean
    public ExceptionTransfer exceptionTransfer() {
        return new DefaultExceptionTransfer();
    }
}

问题是我不知道如何编写代码来将方面与异常传输联系起来。请帮忙,谢谢

【问题讨论】:

  • 您是否尝试简单地为您的目标包激活组件扫描并在您的方面添加@Component 注释?那么您将不再需要任何 @Bean 工厂方法。此外,方面不应有任何@Configuration 注释。而是将该注释添加到您的配置类中。配置是配置,aspcet 是方面。不要混合它们,应用关注点分离原则以获得可维护的应用程序。 Spring 配置不像普通的 Spring 组件/bean。
  • 您的意思是我需要将@Component 放置到方面并将@Bean 移动到另一个类?
  • 是的,@Component @Aspect。如果组件扫描处于活动状态并且DefaultExceptionTransfer 也有@Component 注释,则不需要@Bean。仅当您想手动连接 bean 时,才可以在单独的 @Configuration 类中使用 @Bean。你读过 Spring 手册吗?

标签: java spring aop aspectj spring-aop


【解决方案1】:

如何实现这一点的一个例子是使用@AfterThrowing,如下例所示:

@Slf4j
@Aspect
@Component
public class LoggingAspect {
    @AfterThrowing(value = "execution(* com.amitph.spring.aop.service.FileSystemStorageService.readFile(..))",
            throwing = "ex")
    public void logAfterThrowing(JoinPoint joinPoint, Exception ex) {

        log.error("Target Method resulted into exception, message {}", ex.getMessage());
        notificationService.error(ex.getMessage());
    }
}

【讨论】:

  • 感谢您的回答,但您的回答是关于在方面类中调用服务。意味着我需要@Autowire我的服务方面。我们可以直接委托给服务而不在方面中有它的实例吗?
  • 有 ThrowingAdvice 类,但这也需要 .xml 来配置它。如果要将 bean 链接到 Aspect,则需要 @Autowire 它。没有办法将它作为方法签名的一部分传递(如果这是你所追求的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多