2015-03-26 11 views
1

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

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).

ответ

1

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

Thread.currentThread().setContextClassLoader(bundleClassLoader); 

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

+0

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