我的 java 应用程序在我的 application.property 文件中定义了以下属性。
spring.datasource.url=jdbc:jtds:sqlserver://**mysystemName**/;instance=mydb;domain=DHC;trusted=true;
是否可以读取机器名并添加到spring.data source.url中? mysystemName
应该是动态加载的。
任何读取和更新值运行时间的方法?我正在寻找类似下面的东西。
spring.datasource.url=jdbc:jtds:sqlserver://${someMachineNameFromCode}/;instance=mydb;domain=DHC;trusted=true;
我不想读取属性和格式并回写。我正在寻找一些可以直接在 application.properties
中使用的表达式。
最佳答案
有几种不同的方法可以在运行时更改 Spring 属性。 EnvironmentPostProcessor 和 ApplicationListener 就在其中。在这里,我将包含一个 EnvironmentPostProcessor 示例。
- 创建自定义
EnvironmentPostProcessor
,如下所示。 CustomEnvironmentPostProcessor
类查找应用程序配置属性。- 如果它发现任何属性的值包含匹配
"%%mysystemName%%"
的子字符串模式,它会将其替换为服务器主机名。 - 修改后的属性存储在占位符中。
- 如果修改后的属性placed holder不为空,则将其添加到所有其他属性的开头。
- 您还必须在
META-INF/spring.factories
中注册该类。
Spring 工厂
org.springframework.boot.env.EnvironmentPostProcessor=\
com.basaki.config.CustomEnvironmentPostProcessor
应用程序.yml
spring:
datasource:
url: jdbc:jtds:sqlserver://%%mysystemName%%/;instance=mydb;domain=DHC;trusted=true;
CustomEnvironmentPostProcessor.java
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
private static final String APPLICATION_CONFIGURATION_PROPERTIES =
"applicationConfigurationProperties";
private static final String SYSTEM_PATTERN = "%%mysystemName%%";
@Override
public void postProcessEnvironment(
ConfigurableEnvironment environment,
SpringApplication springApplication) {
MutablePropertySources sources = environment.getPropertySources();
Properties modifiedProps = new Properties();
if (sources.contains(APPLICATION_CONFIGURATION_PROPERTIES)) {
PropertySource<?> source = sources.get(
APPLICATION_CONFIGURATION_PROPERTIES);
if (source instanceof EnumerablePropertySource) {
EnumerablePropertySource target =
(EnumerablePropertySource) source;
for (String name : target.getPropertyNames()) {
Object value = target.getProperty(name);
if (value instanceof String) {
if (((String) value).contains(SYSTEM_PATTERN)) {
try {
String newValue = ((String) value).replaceAll(SYSTEM_PATTERN,
hostname());
modifiedProps.put(name, newValue);
} catch (UnknownHostException e) {
//do nothing
}
}
}
}
}
}
if (!modifiedProps.isEmpty()) {
sources.addFirst(new PropertiesPropertySource("customAppProperties",
modifiedProps));
}
}
public String hostname() throws UnknownHostException {
String hostName = InetAddress.getLocalHost().getHostName();
int index = hostName.indexOf(".local");
hostName = (index > 0) ? hostName.substring(0, index) : hostName;
return hostName;
}
}
关于java - 在 Java 中更新应用程序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46736711/