Spring Cloud Config: программно определить свойства конфигурации сервера

У меня есть самонастроенный сервер Spring Cloud Config (он использует себя для своей собственной конфигурации).

Итак, у меня есть один файл bootstrap.properties с содержимым:

spring.cloud.config.server.bootstrap=true
spring.cloud.config.server.git.uri=<my GitHub repo>
spring.application.name=config
spring.profiles.active=development

Это работает хорошо, но я хочу определить указанные выше свойства с помощью кода Java. На самом деле, я могу оставить эти свойства там, я просто хочу добавить spring.cloud.config.server.git.username и spring.cloud.config.server.git.password программно. Можно ли это как-то сделать?

Я пытался использовать общие подходы для добавления/переопределения свойств Spring, определенных в application.properties, но безуспешно: похоже, что bootstrap.properties должен быть объявлен программно каким-то другим способом (если это вообще возможно).


person Dmytro Titov    schedule 16.02.2018    source источник
comment
bootstrap.properties — это одно из первых, что читает фреймворк Spring. я не думаю, что вы можете добавить к нему программно. Но я считаю, что вы можете передать это значение из командной строки (если вы не хотите помещать его в файл свойств)   -  person pvpkiran    schedule 16.02.2018
comment
@pvpkiran Это была моя первая мысль. Но потом я придумал хакерское решение, пожалуйста, найдите его ниже.   -  person Dmytro Titov    schedule 16.02.2018


Ответы (3)


Что ж, после некоторого изучения источников Spring мне удалось найти решение. Мне это не нравится, потому что это выглядит как грязный хак, но, по крайней мере, это работает. Буду признателен, если кто-нибудь предложит более чистое решение.

ресурсы/META-INF/spring.factories:

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.awesome.package.ConfigClientBootstrapConfiguration

ConfigClientBootstrapConfiguration:

@Configuration
public class ConfigClientBootstrapConfiguration {

    @Autowired
    private ConfigurableEnvironment environment;
    @Autowired
    private ConfigServerProperties server;

    @Bean
    public MultipleJGitEnvironmentRepository environmentRepository() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("spring.cloud.config.server.bootstrap", "true");
        properties.put("spring.cloud.config.server.git.uri", "<GitHub repo URI>");
        properties.put("spring.cloud.config.server.git.username", "username");
        properties.put("spring.cloud.config.server.git.password", "password");
        properties.put("spring.application.name", "config");
        properties.put("spring.profiles.active", "development");
        MapPropertySource customPropertySource = new MapPropertySource("applicationConfig: [classpath:/bootstrap.properties]", properties);
        environment.getPropertySources().replace("applicationConfig: [classpath:/bootstrap.properties]", customPropertySource);
        MultipleJGitEnvironmentRepository repository = new MultipleJGitEnvironmentRepository(this.environment);
        if (this.server.getDefaultLabel() != null) {
            repository.setDefaultLabel(this.server.getDefaultLabel());
        }
        return repository;
    }

}

P.S. Здесь также можно добавить итерацию по существующим свойствам, чтобы сохранить их как в файле (и, возможно, переопределить).

П.П.С. Не знаю почему, но это работало только с именем класса ConfigClientBootstrapConfiguration. Когда я переименовал его, он перестал работать. Хотя меня не очень волнует имя здесь ...

person Dmytro Titov    schedule 16.02.2018
comment
почему вы называете это грязным взломом? - person spencergibb; 01.03.2018
comment
Во-первых, я считаю, что это громоздко: обычно Spring предоставляет более плавные способы настройки. Какого черта я должен знать о каком-то spring.factories? Я никогда не использовал его раньше и в идеале предпочел бы не знать об этом файле :) Во-вторых, я не мог найти простой способ добавить свойства к существующим: мне пришлось перебирать существующие properties и скопировать их на новую карту вручную, потом добавить пару своих, а потом заново установить эту карту. Я также думаю, что это немного хлопотно и совсем не элегантно. - person Dmytro Titov; 01.03.2018

Почему вы предпочитаете:

properties.put("spring.cloud.config.server.git.uri", "<GitHub repo URI>");
properties.put("spring.cloud.config.server.git.username", "username");
properties.put("spring.cloud.config.server.git.password", "password");

добавить их в bootstrap.yml?

или установить их через аргументы виртуальной машины (.... -Dspring.cloud.config.server.git.uri=xxxxxx ....) или через переменные env (... SPRING_CLOUD_CONFIG_SERVER_GIT_URI=xxxxx .... java -jar application.jar?

person ootero    schedule 16.02.2018

Попробуйте ниже в своем bootstrap.yml

    username: ${SPRING_CLOUD_CONFIG_USERNAME:defaultuser}
    password: ${SPRING_CLOUD_CONFIG_PASSWORD:defaultpass}

И добавьте значения в качестве переменных окружения для

SPRING_CLOUD_CONFIG_USERNAME
SPRING_CLOUD_CONFIG_PASSWORD
person Animesh    schedule 21.03.2018