字符串到对象的Spring Config映射

时间:2018-10-19 19:12:42

标签: java spring spring-config

我正在尝试使用{"host1": DatabaseConfigurationProperty("abcd", "mytable", "user")}获取地图,但是下面的代码只会生成一个空的地图。

application.yml:

database:
  host1:
    hostname: abcd
    name: mytable
    username: user

DatabaseConfigurationProperty.java:

@Configuration
@ConfigurationProperties("database")
@EnableConfigurationProperties
@Component
public class DatabaseConfigurationProperty {
    Map<String, DatabaseConfiguration> database = new HashMap<>();

    public Map<String, DatabaseConfiguration> getDatabase() {
        return database;
    }

    public void setDatabase(Map<String, DatabaseConfiguration> database) {
        this.database = database;
    }
}

DatabaseConfiguration.java:

public class DatabaseConfiguration {
    String host;
    String name;
    String username;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getName() {
        return name;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

MainConfig.java:

@Configuration
public class MainConfig {

    @Autowired
    private DatabaseConfigurationProperty databaseConfigurationProperty;

}

databaseConfigurationProperty.getDatabase()作为一个空的Map返回。

1 个答案:

答案 0 :(得分:0)

使用@ConfigurationProperties("database"),您要告诉spring将yaml中属性database下的值映射到类DatabaseConfigurationProperty中的字段。

因此DatabaseConfigurationProperty期望yaml中的database下的一个名为database的字段

database: database: host1: hostname: abcd name: mytable username: user

如果您使用这种格式的Yaml,则您的示例可以正常工作。

您还有一个选择是让Yaml保持不变并更改

@ConfigurationProperties("database") to `@ConfigurationProperties`

然后,课程将在您的Yaml中出现顶级字段database

您还必须将host中的字段名称hostname改成DatabaseConfiguration或更改yaml属性以匹配名称。