Как PropertiesLoaderUtils.loadProperties сопоставляется с конфигурацией POJO с использованием Spring во время выполнения? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть служба, которая потребляет много внешних услуг. Я создаю файл свойств для каждого из них, это довольно мало предопределенных свойств, таких как twil.props, tweet.props, hubpot.props et c

Чтобы получить те свойства во время выполнения я использую PropertiesLoaderUtils , как показано ниже:

Resource resource = new ClassPathResource("/"+apiname +".properties");
Properties props = PropertiesLoaderUtils.loadProperties(resource);

Я хотел бы получить эти свойства в POJO, как ConfigurationProperties, для этой цели я разработал следующий POJO:

public class APIConfig {

    private Integer paginationPerPage;

    private String paginationKeyword;

    private String paginationStyle;

    private String countParamKeyword;

    private String countKey;

    private String offsetKey;
}

Я буду поддерживать файл свойств таким образом, чтобы его можно было легко сопоставить с Config POJO:

Свойства для twil.properties

api.paginationPerPage=10
api.paginationKeyword=limit
api.paginationStyle=offset
api.countParamKeyword=count
api.countKey=count
api.offsetKey=offset

Так что я могу получить это непосредственно в данный POJO с помощью любой из утилит Spring Boot / Spring, config et c?

1 Ответ

0 голосов
/ 22 апреля 2020

Как замечено в комментариях, единственное правильное решение здесь, которое включает нулевое время простоя, а именно @RefreshScope.

  1. Использование зависимости конфигурации весеннего облака
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
Добавить к вашему коду
@Configuration
class SomeConfiguration {
    @Bean
    @RefreshScope
    @ConfigurationProperties("twil.props")
    APIConfig twilConfig() {
        return new ApiConfig()
    }

    @Bean
    @RefreshScope
    @ConfigurationProperties("tweet.props")
    APIConfig tweetConfig() {
        return new ApiConfig()
    }

}

Использование: @Autowire APIConfig tweetConfig; для любого компонента
Вызвать /refresh конечную точку для обновления sh компонентов на новые значения из источников свойств

Пожалуйста, сделайте решение единообразным с экосистемой Spring.

Если вы хотите динамически зависеть от, например, @PathVariable:

private Map<String, AppConfig> sourceToConfig;

@GetMapping("/{source}/foo")
public void baz(@PathVariable source) {
     AppConfig revelantConfig = sourceToConfig.get(source);
     ...
}

Spring предоставляет возможность автоматически собирать карту бинов, где ключ бина - это имя бина.
Переименуйте описанные выше методы bean-компонентов из twilConfig в twil() и вызовите конечную точку следующим образом: /twil/foo ( twilConfig - это неверный путь для конечной точки)

...