AspectJExpressionPointcut использует неправильный classLoader

1

У меня есть приложение Java EE, состоящее из нескольких пакетов OSGi, работающих в контейнере Apache Felix. Один из этих пакетов отвечает за загрузку контекста Spring. Я использую Spring AOP в своем приложении, и в моем пакете возникла следующая ошибка:

java.lang.IllegalArgumentException: warning no match for this type name: com.somepackage.SomeClass [Xlint:invalidAbsoluteTypeName]
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:206)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:192)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:169)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:208)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:262)
at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:294)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:330)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:293)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1573)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)

Причиной этой проблемы является то, что класс (com.somepackage.SomeClass), используемый в pointcat моего аспекта, был загружен пакетом ClassLoader, но AspectJExpressionPointcut передает метод ClassLoader по умолчанию в метод buildPointcutExpression():

private void checkReadyToMatch() {
    if (getExpression() == null) {
        throw new IllegalStateException("Must set property 'expression' before attempting to match");
    }
    if (this.pointcutExpression == null) {
        this.pointcutClassLoader = (this.beanFactory instanceof ConfigurableBeanFactory ?
                ((ConfigurableBeanFactory) this.beanFactory).getBeanClassLoader() :
                ClassUtils.getDefaultClassLoader());
        this.pointcutExpression = buildPointcutExpression(this.pointcutClassLoader);
    }
}

который ничего не знает об этом классе (com.somepackage.SomeClass).

Теги:
osgi
aspectj
spring-aop
spring-aspects

1 ответ

1
Лучший ответ

Проблема была решена путем изменения ClassLoader в инициализации потока Spring Application Context:

Thread.currentThread().setContextClassLoader(bundleClassLoader);

Поэтому метод ClassUtils.getDefaultClassLoader() возвращает bundleClassLoader, который может загружать класс, упомянутый в pointcut.

  • 0
    Отличная новость, что вы решили свою проблему. На StackOverflow совершенно нормально принять свой собственный ответ, чтобы закрыть вопрос. Пожалуйста, сделай так. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню