Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段相关的知识,希望对你有一定的参考价值。
有一个JUnit测试如下:
内存编译器将一个字符串编译为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());
以上是关于Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?
《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》