Весной загрузки аспекта 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,

Итак, мои вопросы:

  1. Почему я получаю java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/metadata/JsonMarshaller если у меня есть spring-boot-configuration-processor как зависимость при компиляции AspectJ?
  2. Как правильно использовать AspectJ в весенней загрузке приложения и собирать с Gradle? (использование @Configuration или же @Component? и почему мое последующее бросание не называется, если я использую @Component или, почему я получаю исключение, если я использую @Configuration?)

Спасибо

0 ответов

Другие вопросы по тегам