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

问题描述 投票:0回答:1

有一个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) )

java spring-boot model-view-controller dynamic
1个回答
0
投票

经过几天的研究,我找到了根本原因。只需将我的自定义类加载器作为spring上下文类加载器的子项,然后就可以成功注入依赖项。源代码如下:

class clazz = compiler.loadClass(“on.the.fly.AgreementReport”,results,context.getClassLoader());

© www.soinside.com 2019 - 2024. All rights reserved.