Spring boot YAML Config未读取所有值

Posted

技术标签:

【中文标题】Spring boot YAML Config未读取所有值【英文标题】:Spring boot YAML Config not reading all values 【发布时间】:2017-06-28 00:12:12 【问题描述】:

我正在尝试在我的 Spring Boot 1.5.1 项目中设置和使用 YAML 作为配置文件。

我的 YAML 文件如下所示:

hue:
    user: cdKjsOQIRY8hqweAasdmx-WMsn
    ip: "http://192.168.1.69"
    scenes:
        sunstatus:
            enabled: true
            id: 93yv8JekmAneCU9
            group: 1
        disable:
            enabled: true
            id: 93yv8JekmAneCU9
            group: 6

阅读 hue.getUser() 非常好。但是,由于某种原因,hue.getScenes() 返回 null。我的 Hue Config 的 Java 代码如下所示:

@Configuration
@ConfigurationProperties(prefix = "hue")
public class Hue 
    private String user;
    private String ip;
    private Scenes scenes;

    /*
     * Getters and setters of course
     */

    public class Scenes 
        private Sunstatus sunstatus;
        private Disable disable;

        /*
         * Getters and setters
         */

        public class Sunstatus 
            private boolean enabled;
            private String id;
            private String group;

            /*
             * Getters and setters
             */
        

        public class Disable 
            private boolean enabled;
            private String id;
            private String group;

            /*
             * Getters and setters
             */
        
    

我也尝试用前缀注释每个类,格式为 hue.scenes.sunstatus、scenes.sunstatus 和 sunstatus。

此外,我还尝试使用 @Value 注释,但没有任何运气。

如果我将数据保存在 application.yml 或外部文件中,结果相同。总是只能到达 getUser()。

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

我看到您正在使用公共非内部类进行嵌套配置,因此您应该添加 @NestedConfigurationProperty

public class Scenes 

    @NestedConfigurationProperty
    private Sunstatus sunstatus;

    @NestedConfigurationProperty
    private Disable disable;

Nested properties

您可以在字段上使用@NestedConfigurationProperty 注释来指示应将常规(非内部)类视为嵌套类。

所以要么添加注释(如果您打算在其他地方使用这些类)或将它们设为public static

【讨论】:

感谢您的提示,但切换到该提示后,我仍然遇到完全相同的问题。 您是否尝试过将类设为公共静态,例如引用状态,添加正确的 getter/setter? 是的,确保再试一次,但仍然为空。【参考方案2】:

试试这个。

@Configuration
@ConfigurationProperties(prefix = "hue")
public class Hue 
    private String user;
    private String ip;
    private Scenes scenes = new Scenes();

    /*
     * Getters and setters of course
     */

    public class Scenes 
        private Sunstatus sunstatus = new Sunstatus();
        private Disable disable = new Disable();

        /*
         * Getters and setters
         */

        public class Sunstatus 
            private boolean enabled;
            private String id;
            private String group;

            /*
             * Getters and setters
             */
        

        public class Disable 
            private boolean enabled;
            private String id;
            private String group;

            /*
             * Getters and setters
             */
        
    

【讨论】:

场景现在通过这些更改初始化,但它仍然从示例返回 null:hue.getScenes().getSunstatus().getId() 这很奇怪。对我来说没问题。

以上是关于Spring boot YAML Config未读取所有值的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 之参数

将 YAML 列表映射到 Spring Boot 中的对象列表

Spring Bootspring boot多环境配置及配置文件

spring boot自动配置

spring-boot学习五:Spring boot配置文件的加载位置

Spring Boot 外部化配置简介