5

我需要在地图中读取 application.properties 文件中的所有属性在下面的代码中,属性测试具有相应的值,但地图为空。如何在不向属性添加前缀的情况下使用 application.properties 文件中的值填充“地图”。

这是我的 application.properties 文件

AAPL=25
GDDY=65
test=22

我正在使用这样的@ConfigurationProperties

@Configuration
@ConfigurationProperties("")
@PropertySource("classpath:application.properties")
public class InitialConfiguration {
    private HashMap<String, BigInteger> map = new HashMap<>();
    private String test;

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

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

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
}
4

5 回答 5

4

这可以使用PropertiesLoaderUtils@PostConstruct来实现

请检查以下示例:

@Configuration
public class HelloConfiguration {
    private Map<String, String> valueMap = new HashMap<>();
    @PostConstruct
    public void doInit() throws IOException {
        Properties properties = PropertiesLoaderUtils.loadAllProperties("application.properties");
        properties.keySet().forEach(key -> {
            valueMap.put((String) key, properties.getProperty((String) key));
        });
        System.err.println("valueMap -> "+valueMap);
    }
    public Map<String, String> getValueMap() {
        return valueMap;
    }
    public void setValueMap(Map<String, String> valueMap) {
        this.valueMap = valueMap;
    }
}
于 2018-09-10T08:20:23.257 回答
3

据我所知,你不能这样做@ConfigurationProperties,那些需要一个前缀才能在 bean 中加载这些属性。

但是,如果您的目标是以编程方式获取“属性 X”的“值 Y”,则始终可以注入Environment并使用该getProperty()方法来查找某些属性,例如:

@Configuration
public class InitialConfiguration {
    @Autowired
    private Environment environment;

    @PostConstruct
    public void test() {
        Integer aapl = environment.getProperty("AAPL", Integer.class); // 25
        Integer gddy = environment.getProperty("GDDY", Integer.class); // 65
        Integer test = environment.getProperty("test", Integer.class); // 22
    }
}
于 2018-09-10T06:18:44.363 回答
2

在spring boot中,如果你需要从application.proprties中获取单个值,你只需要使用给定名称的@Value注解

因此,要获得 AAPL 值,只需添加一个像这样的类级别属性

@Value("${AAPL}")
private String aapl;

如果您需要将完整的属性文件加载为地图,我正在使用 ResourceLoader 将完整的文件加载为流,然后按如下方式解析它

@Autowired
public loadResources(ResourceLoader resourceLoader) throws Exception {      
      Resource resource = resourceLoader.getResource("classpath:myProperties.properties"));
      BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
      String line;
      int pos = 0;
      Map<String, String> map = new HashMap<>();
      while ((line = br.readLine()) != null) {
           pos = line.indexOf("=");
           map.put(line.substring(0, pos), line.substring( pos + 1));
      }
}
于 2018-09-10T05:49:17.117 回答
1

实际上,您可以使用@ConfigurationProperties不带前缀来获取 Spring 应用程序已知的整个属性,即应用程序、系统和环境属性等。

以下示例创建一个完全填充的地图作为 Spring bean。然后在你需要的地方连接/注入这个bean。

@Configuration
class YetAnotherConfiguration {

    @ConfigurationProperties /* or @ConfigurationProperties("") */
    @Bean
    Map<String, String> allProperties() {
        return new LinkedHashMap<>();
    }

}

@Autowire
void test(Map<String, String> allProperties) {
    System.out.println(allProperties.get("AAPL")); // 25
    ...
}
于 2021-03-12T00:29:21.360 回答
0
@PropertySource("classpath:config.properties")
public class GlobalConfig {

  public static String AAPL;
  @Value("${AAPL}")
  private void setDatabaseUrl(String value) {
    AAPL = value;
  }
}

您必须使用 @Value 从 application.properties 文件中获取值

于 2018-09-10T05:55:58.090 回答