Привязка свойств конфигурации к карте - PullRequest
0 голосов
/ 27 сентября 2018

Описание Я пытаюсь связать следующую конфигурацию с моим классом компонентов -

platform:
  service:
    config:
      guard:
       hostname: fancy-host1.kiki.com
       resources:
         - name: bark
           api-path: dog/alert/bark/{dog-id}
         - name: bite
           api-path: dog/alert/bite/{dog-id}
           json-path: $..kill-mode
      play:
        hostname: fancy-host2.kiki.com
        resources:
         - name: lick
           api-path: dog/chill/lick/{dog-id}
           json-path: $..cute-mode

Мой класс компонентов выглядит примерно так:

@Component
@ConfigurationProperties(prefix = "platform.service")
public class DogConfig
{
    @Getter
    @Setter
    public class Resource
    {
        private String name;
        private String apiPath;
        private String jsonPath;
    }

    @Getter
    @Setter
    public class APIConfig
    {
        private String hostname;
        private List<Resource> resources = new ArrayList<>();
    }

    private Map<ServiceType, APIConfig> config = new LinkedHashMap<>();

    public Map<ServiceType, APIConfig> getConfig()
    {
        return config;
    }

    public void setConfig(Map<ServiceType, APIConfig> config)
    {
        this.config = config;
    }
}

ВПриведенный выше код ServiceType представляет собой перечисление со значениями GUARD и PLAY.

Issue Хотя мое приложение для весенней загрузки не выдает никакой ошибки при инициализации, но оно не является обязательныммой класс YAML для DogConfig.Я не уверен, что именно мне здесь не хватает.

Мои усилия по устранению неполадок до сих пор Я полагаюсь на этой весной документ , чтобы передать мои настройки.Я знаю, что @ConfigurationProperties являются типобезопасными и имеют индивидуально протестированные привязки Enums, Maps и POJO.Но я не могу достичь всех трех сразу.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Вы можете сделать это:

  1. Создать POJO следующим образом:

    @Getter
    @Setter
    @ConfigurationProperties("platform.service")
    public class DogProperties {
    
        private Map<String, APIConfig> config;
    
    }
    
  2. В вашем DogConfig вы можете сделать это для полученияthe propierties:

    @Configuration
    @EnableConfigurationProperties(DogProperties.class)
    public class DogConfig {
    
        @Autowire
        private DogProperties properties
    
        ...
    
        @Bean
        @Qualifier("guardConfig")
        public APIConfig guardConfig(){
           return properties.get("guard");
       }
    
     }
    

Если вы посмотрите этот пример, секрет является свойством Map, вы можете анализировать карту с помощью ключа защиты или играть с APIConfig.

0 голосов
/ 27 сентября 2018

добавьте static в свой внутренний класс Resource и APIConfig, например:

public static class Resource {
    private String name;
    private String apiPath;
    private String jsonPath;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...