Весной загрузки аспекта Gradle время компиляции компиляции
У меня есть приложение весенней книги, которое отлично работает. Я хотел бы отправлять мне уведомления по электронной почте, если в моем приложении есть исключения. Я думаю, что aspectj хорошо подходит.
Сначала я попытался использовать ткачество во время выполнения Spring AOP, которое работает нормально для открытых методов. Однако я хотел бы получать уведомления и о частных методах, и у меня есть запланированные задачи. Согласно Spring AOP doc, ткачество во время выполнения не будет работать для запланированных задач и частных методов. Таким образом, я решил использовать ткачество компиляции аспекта в моем загрузочном приложении.
Я нашел официальный плагин Gradge aspectj здесь:
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
добавлено.
Если я заменю @Configuration
с @Component
в моем классе Advice я могу запустить свое приложение, но метод последующего вызова не вызывается. То же самое, если я удалю @Configuration
,
Итак, мои вопросы:
- Почему я получаю
java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller
если у меня естьspring-boot-configuration-processor
как зависимость при компиляции AspectJ? - Как правильно использовать AspectJ в весенней загрузке приложения и собирать с Gradle? (использование
@Configuration
или же@Component
? и почему мое последующее бросание не называется, если я использую@Component
или, почему я получаю исключение, если я использую@Configuration
?)
Спасибо