0

我正在尝试使用 Spring @Configuration 和 @ConfigurationProperties 组合从配置中加载属性。我有一个 POJO,它扩展了 HashMap<Integer, String> 并且里面有一个变量。(见MyConfigPojo下文)。从 .yaml 文件中,我具有相同的形状。但是,在启动应用程序时,尝试将 defaultValue 的字符串解析为 Integer 时出现错误。

@Configuration
@ConfigurationPropeties(prefix = "my-config")
public class MyConfigPojo extends HashMap<Integer, String> {

  private String defaultValue;

  private String getValueForIdOrDefault(int id); // this.get(id) OR ELSE defaultValue
}

在配置中我有这个:

myConfig:
  1: "my first value"
  23: "my 23rd value"
  defaultValue: "cheese"

这导致

APPLICATION FAILED TO START
Description:
Failed to bind properties under 'myPackage' to MyConfigPojo:
Property: myConfig[1]
Value: cheese

我觉得这很奇怪,所以我打开了 TRACE 日志并发现了这个:

99 common frames omittedCaused by: java.lang.NumberFormatException: For input string: "defaultValue" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

有没有办法拦截读取这个文件或告诉 Spring 如何正确设置值?

4

1 回答 1

0

您正在尝试从 .yml 文件中读取 Map,为此,您需要@ConfigurationProperties足够的注释,不需要@Configuration注释(如果使用 Spring Boot)。如果您使用的是 spring-framework,则还需要 @Configuration。

使用这个例子:

myConfig:
  map:
    1: "my first value"
    23: "my 23rd value"
    defaultValue: "cheese"

MyConfigPojo.java

package com.org;


import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;

@Configuration
@ConfigurationProperties(prefix = "my-config")
public class MyConfigPojo {

    private HashMap<String, String> map;

    public HashMap<String, String> getMap() {
        return map;
    }

    public void setMap(HashMap<String, String> map) {
        this.map = map;
    }
}

现在,您可以MyConfigPojo在任何地方(例如,在控制器类中)自动装配此类并读取这些映射键和值。

@Autowired
MyConfigPojo pojo;

现在,您已将键和值视为String该 Map 的数据类型,您将不会得到NumberFormatException.

于 2020-09-01T17:38:39.120 回答