无法从 Java Spring Boot 项目中的 application.yml 文件中读取用户定义类的列表

Posted

技术标签:

【中文标题】无法从 Java Spring Boot 项目中的 application.yml 文件中读取用户定义类的列表【英文标题】:Unable to read list of user defined class from application.yml file in a Java Spring Boot project 【发布时间】:2021-02-13 02:45:43 【问题描述】:

团队您好,

我最近尝试从 Spring Boot 项目(版本 2.3.4)中的 application.yml 文件中读取内容。

最初,yml 文件中的所有属性都被读取为 null。

在多次清理和重建项目后,我可以读取除用户定义的类对象列表(下类中的 List)之外的所有属性,它仍然被读取为空。

我尝试了所有可能的解决方案,但对我没有任何效果。

能否请您检查并帮助我理解我在下面的代码中遗漏了什么,因为 List logComponents 的值仍然从 yml 文件中读取为 null?

谢谢你的期待!

配置 Java 类

@配置 @EnableConfigurationProperties @ConfigurationProperties 公共类 TestAPIConfiguration 私有字符串事件缓存; 私有字符串diskBasedCache; 私有列表 sendAllSMSto; 私人列表 sendAllEmailsto; //这个属性被读取为null,即使 //此属性的值存在于 yml 文件中。 私有列表 logComponents; @NotNull 私有字符串 selfURIPrefix; @NotNull 私有字符串investURIPrefix; @NotNull 私有字符串 ifaURIPrefix; 私有字符串 apiEnv; private final Joiner joiner = Joiner.on( "," ).skipNulls(); 私有静态最终记录器 LOGGER = LoggerFactory.getLogger(TestAPIConfiguration.class); @PostConstruct 公共无效 setSystemProperties() 尝试 System.setProperty(SystemConstants.EVENT_CACHE_PATH, eventCache); System.setProperty(SystemConstants.DISK_BASED_CACHE_PATH, diskBasedCache); System.setProperty(SystemConstants.REQUEST_LOGGING_FIELDS, JSONUtils.getObjectMapper().writeValueAsString(logComponents)); System.setProperty(SystemConstants.ENVIRONMENT_IDENTIFIER, apiEnv); System.setProperty(INVEST_URI_PREFIX,investURIPrefix); System.setProperty(IFA_URI_PREFIX, ifaURIPrefix); 如果(sendAllSMSto != null) System.setProperty(SEND_ALL_SMS_TO, joiner.join(sendAllSMSto)); 如果(sendAllEmailsto != null) System.setProperty(SystemConstants.SEND_ALL_EMAILS_TO, joiner.join(sendAllEmailsto)); 捕捉(异常se) LOGGER.error("配置设置错误:", se.getLocalizedMessage()); 公共字符串 getEventCache() 返回事件缓存; 公共无效setEventCache(字符串事件缓存) this.eventCache = eventCache; 公共字符串 getDiskBasedCache() 返回diskBasedCache; 公共无效setDiskBasedCache(字符串diskBasedCache) this.diskBasedCache = diskBasedCache; 公共列表 getSendAllSMSto() 返回发送所有短信; 公共无效 setSendAllSMSto(List sendAllSMSto) this.sendAllSMSto = sendAllSMSto; 公共列表 getSendAllEmailsto() 返回 sendAllEmailsto; 公共无效 setSendAllEmailsto(List sendAllEmailsto) this.sendAllEmailsto = sendAllEmailsto; 公共列表 getRequestLoggingFields() 返回日志组件; 公共无效 setRequestLoggingFields(List requestLoggingFields) this.logComponents = requestLoggingFields; 公共字符串 getSelfURIPrefix() 返回 selfURIPrefix; 公共无效 setSelfURIPrefix(字符串 selfURIPrefix) this.selfURIPrefix = selfURIPrefix; 公共字符串 getInvestURIPrefix() 返回投资URI前缀; 公共无效 setInvestURIPrefix(字符串投资URIPrefix) this.investURIPrefix = 投资URIPrefix; 公共字符串 getIfaURIPrefix() 返回 ifaURIPrefix; 公共无效 setIfaURIPrefix(字符串 ifaURIPrefix) this.ifaURIPrefix = ifaURIPrefix; 公共字符串 getApiEnv() 返回 apiEnv; 公共无效 setApiEnv(字符串 apiEnv) this.apiEnv = apiEnv;

LogComponent Java 类

@零件 公共类 LogComponent @NotNull 私有字符串头名; @NotNull 私有字符串会话密钥; @NotNull 私有字符串 logPrintKey; 公共字符串 getHeaderName() 返回标头名称; 公共字符串 getSessionKey() 返回会话密钥; 公共字符串 getLogPrintKey() 返回日志打印键;

application.yml 文件

调试:真 服务器: 端口:8080 apiEnv:UAT selfURIPrefix: "https://testurl.localhost.net" 投资URIPrefix:“https://testurl.mediaserver.net” ifaURIPrefix: "https://testurl.secondaryserver.net" 发送所有短信到: - “0000000000” 发送所有电子邮件至: - “abc@testmail.com” eventCache: "C:\\Users\\username\\project\\devnull\\eventcachepurchase.mdb" diskBasedCache: "C:\\Users\\username\\project\\devnull\\cache.mdb" 日志组件: - headerName:X-RT-REQUEST-TRACKER 会话密钥:不可用 logPrintKey:请求跟踪器 - 标题名称:X-RT-INX-DWD 会话密钥:IFX-PDR 日志打印键:PDR_NO - 标题名称:X-RT-IFA-ARN sessionKey:IRX-AXRN logPrintKey:AXR-CDODEEE

【问题讨论】:

【参考方案1】:

终于找到了解决办法。

我没有在 LogComponent 类中创建 setter 方法,因为没有将值分配给变量。

为所有字段添加setter后,此问题已解决。

【讨论】:

以上是关于无法从 Java Spring Boot 项目中的 application.yml 文件中读取用户定义类的列表的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring Boot 项目部署战争

Spring Boot 项目中的 Gradle 无法识别路径中的 Java jdk

Gradle 无法同步 Spring Boot 项目

带有 Java/Spring Boot 的 GraphQL 无法从传递的查询中选择定义为在模式中的字段上定义的自定义指令

线程“main”中的异常 java.lang.ClassNotFoundException - Spring Boot,多模块 gradle 项目

无法在 Spring Boot 应用程序中读取 application.properties