Spring Boot Aspectj Gradle编译时编织问题

时间:2018-07-13 16:33:38

标签: spring-boot gradle aspectj compile-time-weaving

我有一个Spring Book应用程序,可以正常工作。如果我的应用程序抛出异常,我想向我发送电子邮件通知。我认为Aspectj非常合适。

首先,我尝试使用Spring AOP运行时编织,对于公共方法来说,它可以正常工作。但是,我也想获得有关私有方法的通知,并且我已经安排了任务。根据Spring AOP的文档,运行时编织不适用于计划任务和私有方法。因此,我决定在引导应用程序中使用Aspectj编译时编织。

我在这里找到了官方的AspectJ Gradle插件:

https://plugins.gradle.org/plugin/at.jku.isse.gradient-gradle

我的启动应用程序具有以下依赖性:

compile group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version:'1.5.14.RELEASE'

如果使用默认编译器,我的项目可以正常编译。但是,如果我使用AspectJ编译器,它总是会抱怨:

[ant:iajc] warning Field value processing of @ConfigurationProperty meta-data is not supported
[ant:iajc] warning Hibernate JPA 2 Static-Metamodel Generator 4.3.11.Final
[ant:iajc] error at (no source information available)
D:\work\proj\build\classes\java\main\com\abc\dao\entity\Channel_.java:0::0 Internal compiler error: java.lang.Exception: java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller at org.aspectj.org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:169)

如果我删除了该依赖关系,aspectj会编译好,我得到了jar文件。但是当我运行代码时,我得到了:

Caused by: org.springframework.aop.framework.AopConfigException: Advice must be declared inside an aspect type: Offending method 'public void com.proj.aop.AspectConfiguration.afterThrowing(org.aspectj.lang.JoinPoint,java.lang.Throwable)' in class [com.proj.aop.AspectConfiguration]

这是我的咨询班:

package com.proj.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

@Aspect
@Configuration
public class AspectConfiguration {
    @AfterThrowing (pointcut="execution(* org.hibernate..*.*(..)) || execution(* com.proj..*.*(..))", throwing="excep")
    public void afterThrowing(JoinPoint joinPoint, Throwable excep){
        System.out.println("inafterthrowing");
    }
}

并且我的appconfig已添加注释@EnableAspectJAutoProxy

如果我在Advice类中将@Configuration替换为@Component,则可以运行我的应用程序,但不会调用afterthrowthing方法。如果删除@Configuration,也是如此。

所以我的问题是:

  1. 如果由AspectJ编译时具有java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller作为依存关系,为什么会得到spring-boot-configuration-processor
  2. 在Spring Boot应用程序中使用AspectJ并使用Gradle构建的正确方法是什么? (使用@Configuration@Component?为什么使用@Component时不调用我的后掷,或者为什么使用@Configuration时抛出异常?)

谢谢

0 个答案:

没有答案