Spring Boot AnnotationConfigEmbeddedWebApplicationContext не может заполнить объявленные поля с автопроводкой, которые находятся в динамическом классе - PullRequest
0 голосов
/ 19 декабря 2018

Существует следующий тест JUnit:

Компилятор памяти компилирует строку в класс on.the.fly. Отчет, который содержит некоторые объявленные поля @Autowired, например reportRepository и т. Д.

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

Когда он помещен в среду MVC, используется autowired контекст приложения, который является AnnotationConfigEmbeddedWebApplicationContext, autowired значение свойства can 'не быть населенным.

с отладкой, findCandidateNames метод return [], который должен возвращать массив, содержащий имя поля, как в тестовой среде.Пожалуйста, обратитесь к исходному коду и дайте мне несколько советов.Спасибо.

results =  compiler.compile("Report.java", reportClassString);

Class<?> clazz = compiler.loadClass("on.the.fly.Report", results);

IReport report = (IReport) applicationContext.getAutowireCapableBeanFactory().createBean(clazz);    
report.creatPdf(reportObject);

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка при создании bean-компонента с именем 'on.the.fly.AgreementReport': неудовлетворенная зависимость, выраженная через поле 'AgreementReportProperties';вложенное исключение - org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего компонента типа com.lims.api.report.domain.dto.AgreementReportProperties ': ожидается, что по крайней мере 1 компонент будет квалифицирован как кандидат для автоматической передачи.Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательный = true)} в org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject (Autowirederaj.beans.factory.annotation.InjectionMetadata.inject (InjectionMetadata.java:91) по адресу com.lims.api.sample.web.controller.AgreementController.downloadPdfFile (AgreementController.java:161) в sun.reflect.NativeMetholAnitOmp0)

1 Ответ

0 голосов
/ 28 декабря 2018

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

Class clazz = compiler.loadClass ("on.the.fly.AgreementReport", результаты, context.getClassLoader ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...