Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中更新应用程序属性_Java_Spring - Fatal编程技术网

在Java中更新应用程序属性

在Java中更新应用程序属性,java,spring,Java,Spring,我的java应用程序在我的application.property文件中定义了以下属性 spring.datasource.url=jdbc:jtds:sqlserver://**mysystemName**/;instance=mydb;domain=DHC;trusted=true; 是否可以读取机器名并将其添加到spring.data source.url中?应动态加载mysystemName 有没有读取和更新运行时值的方法?我在找下面这样的东西 spring.datasource.ur

我的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;

我不想读取属性和格式并写回。我正在寻找一些可以直接在
应用程序中使用的表达式。properties

有几种不同的方法可以在运行时更改Spring属性Environment后处理器ApplicationListener就是其中之一。这里,我将包括一个EnvironmentPostProcessor示例

  • 创建自定义
    环境后处理器
    ,如下所示
  • CustomEnvironmentPostProcessor
    类查找应用程序配置属性
  • 如果它发现任何属性的值包含与
    “%%mysystemName%%”匹配的子字符串模式,则会将其替换为服务器主机名
    
  • 修改后的特性存储在占位符中
  • 如果放置的修改特性保持架不是空的,则会将其添加到所有其他特性的开头
  • 您还必须在
    META-INF/spring.factories
    中注册该类
  • 春季工厂 application.yml CustomEnvironmentPostProcessor.java
    公共类CustomEnvironmentPostProcessor实现EnvironmentPostProcessor{
    私有静态最终字符串应用程序\u配置\u属性=
    “应用程序配置属性”;
    私有静态最终字符串SYSTEM_PATTERN=“%%mysystemName%%”;
    @凌驾
    公共空间后处理环境(
    可配置的环境,
    Spring应用程序(Spring应用程序){
    MutablePropertySources sources=environment.getPropertySources();
    Properties modifiedProps=新属性();
    if(sources.contains(应用程序配置属性)){
    PropertySource=sources.get(
    应用程序(配置)(属性);;
    if(EnumerablePropertySource的源实例){
    EnumerablePropertySource目标=
    (EnumerablePropertySource)源;
    for(字符串名称:target.getPropertyNames()){
    对象值=target.getProperty(名称);
    if(字符串的值实例){
    if(((字符串)值).contains(系统_模式)){
    试一试{
    字符串newValue=((字符串)值).replaceAll(系统_模式,
    主机名());
    modifiedProps.put(名称,newValue);
    }捕获(未知后异常e){
    //无所事事
    }
    }
    }
    }
    }
    }
    如果(!ModifiedOps.isEmpty()){
    sources.addFirst(新属性PropertySource(“customAppProperties”),
    (p),;
    }
    }
    公共字符串hostname()引发UnknownHostException{
    字符串hostName=InetAddress.getLocalHost().getHostName();
    int index=hostName.indexOf(“.local”);
    主机名=(索引>0)?主机名。子字符串(0,索引):主机名;
    返回主机名;
    }
    }
    
    更改数据源url似乎很奇怪,因此我需要问您为什么要这样做。无论如何:这可能有助于复制
    org.springframework.boot.env.EnvironmentPostProcessor=\
      com.basaki.config.CustomEnvironmentPostProcessor
    
    spring:
      datasource:
        url: jdbc:jtds:sqlserver://%%mysystemName%%/;instance=mydb;domain=DHC;trusted=true;
    
    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;
        }
    }