当前位置: 首页 > 知识库问答 >
问题:

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

钮善
2023-03-14

大家好,

我最近在一个spring boot项目(版本2.3.4)中尝试从application.yml文件中读取内容。

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

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

我试过所有可能的解决办法,但没有一个对我有效。

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

在期待中感谢你!

配置Java类


    @Configuration
    @EnableConfigurationProperties
    @ConfigurationProperties
    public class TestAPIConfiguration {
     
        private String eventCache;
        
        private String diskBasedCache;
    
        private List<String> sendAllSMSto;
    
        private List<String> sendAllEmailsto;
        
        //This property is getting read as null even if
        //value for this property is present in yml file.
        private List<LogComponent> logComponents;
        
                
        @NotNull
        private String selfURIPrefix;
        
        @NotNull
        private String investURIPrefix;
        
        @NotNull
        private String ifaURIPrefix;
        
        private String apiEnv;
        
        private final Joiner joiner = Joiner.on( "," ).skipNulls();
        
        private static final Logger LOGGER = LoggerFactory.getLogger(TestAPIConfiguration.class);
        
        @PostConstruct
        public void setSystemProperties()
        {
            try
            {
                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);
                if(sendAllSMSto != null)
                    System.setProperty(SEND_ALL_SMS_TO, joiner.join(sendAllSMSto));
                if(sendAllEmailsto != null)
                    System.setProperty(SystemConstants.SEND_ALL_EMAILS_TO, joiner.join(sendAllEmailsto));
            }
            catch(Exception se)
            {
                LOGGER.error("Error in Configuration Setup: {}", se.getLocalizedMessage());
            }
        }
    
        public String getEventCache() {
            return eventCache;
        }
    
        public void setEventCache(String eventCache) {
            this.eventCache = eventCache;
        }
    
        public String getDiskBasedCache() {
            return diskBasedCache;
        }
    
        public void setDiskBasedCache(String diskBasedCache) {
            this.diskBasedCache = diskBasedCache;
        }
    
        public List getSendAllSMSto() {
            return sendAllSMSto;
        }
    
        public void setSendAllSMSto(List<String> sendAllSMSto) {
            this.sendAllSMSto = sendAllSMSto;
        }
    
        public List getSendAllEmailsto() {
            return sendAllEmailsto;
        }
    
        public void setSendAllEmailsto(List<String> sendAllEmailsto) {
            this.sendAllEmailsto = sendAllEmailsto;
        }
    
        public List getRequestLoggingFields() {
            return logComponents;
        }
    
        public void setRequestLoggingFields(List<LogComponent> requestLoggingFields) {
            this.logComponents = requestLoggingFields;
        }
    
        public String getSelfURIPrefix() {
            return selfURIPrefix;
        }
    
        public void setSelfURIPrefix(String selfURIPrefix) {
            this.selfURIPrefix = selfURIPrefix;
        }
    
        public String getInvestURIPrefix() {
            return investURIPrefix;
        }
    
        public void setInvestURIPrefix(String investURIPrefix) {
            this.investURIPrefix = investURIPrefix;
        }
    
        public String getIfaURIPrefix() {
            return ifaURIPrefix;
        }
    
        public void setIfaURIPrefix(String ifaURIPrefix) {
            this.ifaURIPrefix = ifaURIPrefix;
        }
    
        public String getApiEnv() {
            return apiEnv;
        }
    
        public void setApiEnv(String apiEnv) {
            this.apiEnv = apiEnv;
        }
    }

LogComponent Java类


    @Component
    public class LogComponent {
    
        @NotNull
        private  String headerName;
        @NotNull
        private  String sessionKey;
        @NotNull
        private  String logPrintKey;
        
        public String getHeaderName() {
            return headerName;
        }
        public String getSessionKey() {
            return sessionKey;
        }
        public String getLogPrintKey() {
            return logPrintKey;
        }   
    }

application.yml文件


    debug: true
    server:
       port: 8080
    apiEnv: UAT
    selfURIPrefix: "https://testurl.localhost.net"
    investURIPrefix: "https://testurl.mediaserver.net"
    ifaURIPrefix: "https://testurl.secondaryserver.net"
    sendAllSMSto:
       - "0000000000"
    sendAllEmailsto: 
       - "abc@testmail.com"
    eventCache: "C:\\Users\\username\\project\\devnull\\eventcachepurchase.mdb"
    diskBasedCache: "C:\\Users\\username\\project\\devnull\\cache.mdb"
    logComponents:
       - headerName: X-RT-REQUEST-TRACKER
         sessionKey: NOT AVAILABLE
         logPrintKey: REQUEST-TRACKER
       - headerName: X-RT-INX-DWD
         sessionKey: IFX-PDR
         logPrintKey: PDR_NO
       - headerName: X-RT-IFA-ARN
         sessionKey: IRX-AXRN
         logPrintKey: AXR-CDODEEE

共有1个答案

陶睿
2023-03-14

终于找到了解决办法。

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

在为所有字段添加setter之后,这个问题就解决了。

 类似资料:
  • 我有一个3节点的Apache Ignite集群,我创建了一个以整数为键的缓存,以'subscriber'POJO为值,当我从JAVA程序内部连接到集群并访问缓存时,我得到了上面提到的异常,我有'peerClassLoading'属性设置为false,并且我在所有节点中部署了'subscriber'POJO二进制文件,请在下面找到完整的堆栈跟踪。我错过了什么?当我在JAVA程序中用启动客户端时,它为

  • 问题内容: 我有一个文本文件,其中包含一个由数字组成的表格,例如: 5 10 6 6 20 1 7 30 4 8 40 3 9 23 1 4 13 6 例如,如果我想要仅包含在第二列中的数字,我该如何将该列提取到列表中? 问题答案: 您可以使用列表理解来做同样的事情 Docs 返回字符串的单词列表。如果不存在可选的第二个参数sep或“无”,则单词将由任意的空白字符字符串(空格,制表符,换行符,返回

  • 我的logback-spring.xml从application.properties中读取正常,但从application.yml中读取不正常。在我的项目中,我们被要求仅使用YAML格式,因为该格式正在同一项目中的其他微服务中使用,所以我无法添加属性文件。请帮助我为什么我的application.yml在logback.xml中没有被读取 我尝试了各种方法,并在stackoverflow上搜索了

  • 我正在尝试从子项目中读取文件示例-dfx-sbi 文件位于src/main/resources文件夹内 那为什么文件没有加载呢?

  • 我试图加载预填充数据到我的flutter应用程序。我已经在项目的根目录中创建了资产文件夹 在pubspec.yaml中添加了该文件引用 下面是我访问数据库的DBHandler.dart文件代码 我得到的错误是 在代码的给定行下面。 ByteData=等待rootBundle.load(连接('资产',dbName));

  • 我有一个项目来解析一个大文件中的一些信息。 结构如下: 当我根据自己的想法运行应用程序时,我可以通过以下方式读取文件: 然后,如果我运行: 一切顺利。 即使在生成GraalNative jar并从本机generate jar运行应用程序时: 这一切都很好。 但是,当我运行命令来构建和运行docker时,我得到了我的错误: 有人能帮我吗?如何读取Docker容器上src/main/Resources