Сторонний JAR, содержащий Pointcut AspectJ в приложении Spring MVC

У меня есть внешний файл jar, который находится внутри только одного класса AspectJ.

@Aspect
public class SecurityAspect {

   @Pointcut("execution(* *(..)) && @annotation(external.package.Secure)")
 public void doCheck() {}

   @Before("doCheck()")
 public void applyCheck(JoinPoint joinPoint) {
       //sth...
   }

}

Я хочу запустить этот аспект, используя аннотацию @Secure в контроллере Spring MVC

@Secure
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void test() {
  System.out.println("test");
}

В aspects-config.xml есть все необходимое для рассмотрения аспектов моего проекта.

    <aop:aspectj-autoproxy>
     <aop:include name = "log" /> (non external)
     <aop:include name = "sec" />
    </aop:aspectj-autoproxy>

    <bean id = "log"
    class = "internal.package.LogAspect"
    factory-method = "aspectOf" />

    <bean id = "sec"
    class = "external.package.SecurityAspect"
    factory-method = "aspectOf" />

Eclipse распознает, что что-то привязано к test(), но когда я запускаю сервер, Spring не может найти класс external.package.SecurityAspect

Caused by: java.lang.ClassNotFoundException: external.package.SecurityAspect

В моем приложении у меня уже есть не внешний аспект, который ведет журнал для утилиты, и перемещение аспекта безопасности в пакет проекта работает нормально.

Наиболее полные (для меня) вопросы, с которыми я столкнулся:

это (1), но я не уверен, что это полностью правильно, поскольку Eclipse распознает это также во внешнем Jar ... но, возможно, это мое недоразумение;

это (2) В этом есть смысл! Я удалил свою внешнюю библиотеку из maven, удалил все указатели на application-context.xml (верно?), Импортированные этим интерфейсом, запуском и ... Error creating bean with name 'log' defined in file [path/to/aspects-config.xml]: No matching factory method found: factory method 'aspectOf()'. Check that a method with the specified name exists and that it is static. (почему жалуется на аспект log?)

это (3) говорит о <context:load-time-weaver />, но, похоже, не работает после добавления в контекст моего приложения xml.

Эта проблема возникает только в том случае, если я использую EXTERNAL JAR не в том же пакете.

Может ли кто-нибудь лучше прояснить, действительно ли это невозможно (это (3)) или возможно сделать внешний аспект для импорта в проекты в качестве сторонней библиотеки?

aspectOf следует использовать для аспектов, написанных в традиционном синтаксисе AspectJ (тип aspect). С аннотированным классом @Aspect вам не следует использовать фабричный метод, а просто создать экземпляр bean-компонента.

M. Deinum 13.07.2018 12:06

Не ожидал, что именно это действительно решило мою проблему (невероятное О_О) ты классный, спасибо

Andrea Grimandi 13.07.2018 12:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
457
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

М. Дейнум в комментариях ниже заметил, что использование factory-method = "aspectOf" не обязательно с типами, отличными от aspect (тогда для всех моих @Aspect это не так).

Убрал то, автозагрузку, никаких исключений и теперь у меня рабочий аспект.

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