Spring Cloud Config:以编程方式定义服务器配置属性
Spring Cloud Config: define server config properties programmatically
我已自行配置 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
。有可能以某种方式做到吗?
我尝试对 application.properties
中定义的 Spring 个属性的 adding/overriding 使用通用方法,但没有成功:看起来 bootstrap.properties
应该在一些程序中以编程方式声明其他方式(如果可能的话)。
好吧,在深入研究 Spring 资源之后,我设法找到了解决方案。我不喜欢它,因为它看起来像一个肮脏的黑客,但至少它有效。如果有人提出更清洁的解决方案,我将不胜感激。
resources/META-INF/spring.工厂:
# 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。也可以在此处对现有属性添加迭代以将它们保留在文件中(并可能覆盖)。
P.P.S。我不知道为什么,但它只对 class 名称 ConfigClientBootstrapConfiguration
有效。当我重命名它时,它停止工作。不过我不太关心这里的命名...
你为什么喜欢:
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
?
或通过 VM args (.... -Dspring.cloud.config.server.git.uri=xxxxxx ....
) 或环境变量 (... SPRING_CLOUD_CONFIG_SERVER_GIT_URI=xxxxx .... java -jar application.jar
?
设置它们
在您的 bootstrap.yml
中尝试以下操作
username: ${SPRING_CLOUD_CONFIG_USERNAME:defaultuser}
password: ${SPRING_CLOUD_CONFIG_PASSWORD:defaultpass}
并将值添加为-
的环境变量
SPRING_CLOUD_CONFIG_USERNAME
SPRING_CLOUD_CONFIG_PASSWORD
我已自行配置 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
。有可能以某种方式做到吗?
我尝试对 application.properties
中定义的 Spring 个属性的 adding/overriding 使用通用方法,但没有成功:看起来 bootstrap.properties
应该在一些程序中以编程方式声明其他方式(如果可能的话)。
好吧,在深入研究 Spring 资源之后,我设法找到了解决方案。我不喜欢它,因为它看起来像一个肮脏的黑客,但至少它有效。如果有人提出更清洁的解决方案,我将不胜感激。
resources/META-INF/spring.工厂:
# 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。也可以在此处对现有属性添加迭代以将它们保留在文件中(并可能覆盖)。
P.P.S。我不知道为什么,但它只对 class 名称 ConfigClientBootstrapConfiguration
有效。当我重命名它时,它停止工作。不过我不太关心这里的命名...
你为什么喜欢:
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
?
或通过 VM args (.... -Dspring.cloud.config.server.git.uri=xxxxxx ....
) 或环境变量 (... SPRING_CLOUD_CONFIG_SERVER_GIT_URI=xxxxx .... java -jar application.jar
?
在您的 bootstrap.yml
中尝试以下操作 username: ${SPRING_CLOUD_CONFIG_USERNAME:defaultuser}
password: ${SPRING_CLOUD_CONFIG_PASSWORD:defaultpass}
并将值添加为-
的环境变量SPRING_CLOUD_CONFIG_USERNAME
SPRING_CLOUD_CONFIG_PASSWORD