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));
}
}
Действительно, вы можете использовать
В следующем примере создается полностью заполненная карта в виде 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