我有一个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
,也是如此。
所以我的问题是:
java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller
作为依存关系,为什么会得到spring-boot-configuration-processor
?@Configuration
或@Component
?为什么使用@Component
时不调用我的后掷,或者为什么使用@Configuration
时抛出异常?)谢谢