ConfigurationProperties 如何注入属性?

问题描述

我在 application.yml 文件中有一个属性

service:
  server:
    name: name
    url: url

我需要在我的应用程序中获取它。我有一个用于许多项目的模块,包括这个。它包含一个配置类,其中定义了所有项目的通用属性。它解决了这个问题。看起来像这样:

public class CommonProperties {
    protected ServerProperties server;

    public ServerProperties getServer() {
        return server;
    }

    public void setServer(ServerProperties server) {
        this.server = server;
    }
}

服务器属性

public class ServerProperties {
    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

每个项目除了公共属性之外还有几个自己的属性,所以每个项目都创建自己的配置类,如下所示:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "service")
public class ProjectProperties extends CommonProperties {
    ....
}

但是在这个项目中,server 比普通的 server 拥有更多的属性。这是url
所以我决定像这样从 ServerPropertiesExt 类继承 ServerProperties 类:

public class ServerPropertiesExt extends ServerProperties {
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

并在 ProjectProperties 中创建一个此类型的字段:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "service")
public class ProjectProperties extends CommonProperties {
    private ServerPropertiesExt server;
    ....

    public ServerPropertiesExt getServer() {
        return server;
    }

    public void setServer(ServerPropertiesExt server) {
        this.server = server;
    }
    ....
}

在启动应用程序后进行这样的配置,ProjectProperties.server 字段为null,但字段ProjectProperties.super().server 填充了类型为ServerProperties 的对象。这不是我需要的,因为 ServerProperties 对象没有 String url 字段。我正好需要对象 ServerPropertiesExt
当我将 @Component 注释添加ServerPropertiesExt 类并将其自动装配ProjectProperties 中时,我解决了这个问题:

@Component
public class ServerPropertiesExt extends ServerProperties {
    private String url;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "service")
public class ProjectProperties extends CommonProperties {
    private ServerPropertiesExt server;
    ....

    public ProjectProperties(ServerPropertiesExt server) {
        this.server = server;
    }

    public ServerPropertiesExt getServer() {
        return server;
    }

    public void setServer(ServerPropertiesExt server) {
        this.server = server;
    }
    ....
}

那么问题就解决了。然后 ProjectProperties.server 填充了 ServerPropertiesExt 对象,String url 字段也填充了。但是 ProjectProperties.super().server 也填充了相同的 ServerPropertiesExt 对象,其中填充了 String url 字段。
问题:它为什么有效?为什么现在字段 ProjectProperties.super().serverProjectProperties.server 填充了相同的对象?在第一种情况下,ProjectProperties.super().server 填充了 ServerProperties 对象。
也许我的问题有另一种解决方案?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...