Springboot не удалось сопоставить файл свойств с переменной - PullRequest
0 голосов
/ 31 мая 2019

я хочу отобразить значения между файлом yaml с Map<String, List<String>> в подпапке

country.yml файл:

entries:
  map:
     MY:
      - en
      - zh

SampleConfig файл:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("entries")
public class SampleConfig {

    private Map<String, List<String>> map = new HashMap<>();

    @Bean
    public void bean1(){
        System.err.println("map has size: "+map.size());
    }
}

Но map.size() всегда равен 0, не уверен, что я делаю неправильно.

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Есть две проблемы

1) По умолчанию пружина будет искать application.yml или application.properties в местах по умолчанию

Для решения вышеуказанной проблемы вы можете использовать application.yml вместоcountry.yml

2) Вы можете использовать @PropertySource для загрузки любого внешнего файла свойств, но yml не поддерживается с этой аннотацией

24.7.4 Недостатки YAML вы не можете использовать @PropertySource с yml file

YAML-файлы не могут быть загружены с помощью аннотации @PropertySource. Таким образом, в случае, если вам нужно загрузить значения, которыеКстати, вам нужно использовать файл свойств.

Как читать yml-файл, используя Spring @ PropertySource

2 голосов
/ 31 мая 2019

это сработает и распечатает CountryData : {MY=[en, zh]}

, но обязательно прочитайте ответ Дэдпула.

хак здесь, чтобы переопределитьимя конфигурации по умолчанию 'application' от 'country'

в этом примере, я сделал это, установив его через свойство System, но запуск вашего приложения через java -jar mycountryapp.jar --spring.config.name=country должен работать идеально

@SpringBootApplication
public class Application {

    static {
      System.setProperty("spring.config.name", "country");
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

@Service
class CountryService {
  private final CountryData countryData;
    public CountryService(CountryData countryData) {
        this.countryData = countryData;
    }

    @EventListener(ApplicationReadyEvent.class)
    public void showCountryDataOnStartup() {
      System.err.println("CountryData : " + countryData.getMap());
    }

}

@Configuration
@ConfigurationProperties(prefix = "entries")
class CountryData {

    Map<String, List<String>> map;

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

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

}
1 голос
/ 31 мая 2019

Если ваше приложение выбирает конфигурацию из country.yml (я бы тоже это проверил) - вам нужны геттеры и сеттеры, чтобы заставить его работать.просто добавьте:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("entries")
public class SampleConfig {

    private Map<String, List<String>> map = new HashMap<>();

    public Map<String, List<String>> getMap(){
        return map;
    }
    public void setMap(Map<String, List<String>> map){
        this.map=map;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...