Ошибка прокси-сервера CGLIB после загрузки определения bean-компонента Spring в XmlWebApplicationContext во время выполнения - PullRequest
0 голосов
/ 23 апреля 2010

Я загружаю дополнительные определения одноэлементных компонентов во время выполнения из внешнего файла JAR в существующий XmlWebApplicationContext моего приложения:


BeanFactory beanFactory = xmlWebApplicationContext.getBeanFactory();
DefaultListableBeanFactory defaultFactory = (DefaultListableBeanFactory)beanFactory;
final URL url = new URL("external.jar");
final URL[] urls = {url};
ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
defaultFactory.setBeanClassLoader(loader);
final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(defaultFactory);
final DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
resourceLoader.setClassLoader(loader);
scanner.setResourceLoader(resourceLoader);
scanner.scan("com.*");
Object bean = xmlWebApplicationContext.getBean("externalBean");


После всего вышеперечисленного xmlWebApplicationContext содержит все внешние определения bean-компонентов. Но когда я пытаюсь получить бин из контекста, генерируется исключение:

Couldn't generate CGLIB proxy for class ...

В режиме отладки я увидел, что в процессе инициализации компонента первый раз создается прокси org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator

и чем пытаются генерировать прокси с org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

, но терпит неудачу с упомянутым исключением.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2010

Причина была определена. Второе определение создателя прокси было найдено в spring-common-manager.xml:

"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"
which intercepts beans with names DAO, Dao, *ManagerTarget.

Во время создания моего внешнего bean-компонента прокси-компонент classLoader был установлен в системный загрузчик классов. Поэтому создатель прокси не смог найти определение класса для внешнего компонента.

Кажется, что без загрузчика класса обновления, который добавлен к фабрике по умолчанию, невидимы некоторые служебные бины, такие как создатели прокси.

Мое решение состоит в том, чтобы получить bean-компонент создателя прокси и неявно установить на него загрузчик классов, но, возможно, существует более эффективный способ решения этой проблемы.

0 голосов
/ 23 апреля 2010

Убедитесь, что bean-компонент:

  • не final
  • имеет частный конструктор
...