Как правильно использовать карту свойств, прочитанную из .yaml с аннотацией @Value Spring - PullRequest
2 голосов
/ 16 апреля 2019

Я вставил свойства из карты, считанные из некоторого .yaml в приложении Spring Boot, следующим образом:

@Value("#{${app.map}}")
private Map<String, String> indexesMap = new HashMap<>();

Но ни

app:
    map: {Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'} 
    //note values in single quotes  

nor
app:
    map: {Countries: "countries.xlsx", CurrencyRates: "rates.xlsx"}

(как объяснено в https://www.baeldung.com/spring-value-annotation)

, ни

app:
    map:
      "[Countries]": countries.xslx
      "[CurrencyRates]": rates.xlsx

(как предложено в https://stackoverflow.com/a/51751123/2566304)

работает - я получаю сообщение «Сбой внедрения зависимостей с автопроводкой; вложенное исключение - java.lang.IllegalArgumentException: Не удалось разрешить заполнитель '

В то же время это работает:

@Value("#{{Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'}}")
private Map<String, String> indexesMap = new HashMap<>();

Но я бы хотел вывести свойства

1 Ответ

3 голосов
/ 16 апреля 2019

Используйте @ConfigurationProperties, как предлагается в одном из ответов на вопрос, который вы связали:

@Bean(name="AppProps")
@ConfigurationProperties(prefix="app.map")
public Map<String, String> appProps() {
    return new HashMap();
}

, а затем

@Autowired
@Qualifier("AppProps")
private Map<String, String> props;

будет работать с конфигом

app:
  map:
    Countries: 'countries.xlsx'
    CurrencyRates: 'rates.xlsx'

EDIT: @Value аннотация тоже работает, но вы должны рассматривать ее как строку в YAML:

@Value("#{${app.map}}")
private Map<String, String> props;

и

app:
  map: "{Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'}"

Обратите внимание на кавычки вокруг значения карты. Очевидно, Spring в этом случае разбирает его на строку.

...