Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段

观书散遗帙,探古穷至妙。这篇文章主要讲述Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段相关的知识,希望能为你提供帮助。
有一个JUnit测试如下:
【Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段】内存编译器将一个字符串编译为on.the.fly类。该报告包含一些@Autowired声明的字段,如reportRepository等。
一切都按预期工作,动态类报告可以使用自动装配的字段实现其功能。
当它被放入MVC环境时,使用autowired应用程序上下文,即AnnotationConfigEmbeddedWebApplicationContext,无法填充autowired属性值。
使用debug,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:创建名为'on.the.fly.AgreementReport'的bean时出错:通过字段'agreementReportProperties'表示不满意的依赖关系; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为'com.lims.api.report.domain.dto.AgreementReportProperties'的限定bean可用:预计至少有1个bean可以作为autowire候选者。依赖注释:{org.springframework.beans.factory.annotation.Autowired(required = true)}在org.springframework的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587)。 beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的com.lims.api.sample.web.controller.AgreementController.downloadPdfFile(AgreementController.java:161) )
答案经过几天的研究,我找到了根本原因。只需将我的自定义类加载器作为spring上下文类加载器的子项,然后就可以成功注入依赖项。源代码如下:
class clazz = compiler.loadClass(“on.the.fly.AgreementReport”,results,context.getClassLoader());

    推荐阅读