Spring Boot читает свойства без префикса к карте

Мне нужно прочитать все свойства в файле application.properties на карте. В приведенном ниже коде свойство test имеет соответствующее значение, но карта пуста. Как мне заполнить "карту" значениями в файле 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;
    }
}

5 ответов

Решение

Это может быть достигнуто с помощью 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;
    }
}

Вы не можете сделать это с @ConfigurationProperties Насколько мне известно, для загрузки этих свойств внутри компонента требуется префикс.

Однако, если ваша цель состоит в том, чтобы получить "значение Y" для "свойства X" программно, вы всегда можете ввести 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
    }
}

При весенней загрузке, если вам нужно получить одно значение из 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));
      }
}

Действительно, вы можете использовать без префикса, чтобы получить полные свойства, известные приложению Spring, то есть свойства приложения, системы и среды и т. д.

В следующем примере создается полностью заполненная карта в виде bean-компонента Spring. Затем подключите/вставьте этот компонент туда, куда вам нужно.

      @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
    ...
}
@PropertySource("classpath:config.properties")
public class GlobalConfig {

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

Вы должны использовать @Value, чтобы получить значение из файла application.properties

Другие вопросы по тегам