Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 将applicationConfig PropertySource添加到新环境_Java_Spring_Spring Boot_Spring Environment - Fatal编程技术网

Java 将applicationConfig PropertySource添加到新环境

Java 将applicationConfig PropertySource添加到新环境,java,spring,spring-boot,spring-environment,Java,Spring,Spring Boot,Spring Environment,我目前正在将现有的应用程序迁移到SpringBoot1.2(使用Mule3;与Spring4.2不兼容)。这个应用程序包含一个提供的库(我无法修改)servlet,它通过读取一些应用程序包含的带有bean定义的XML文件来创建几个ClasspathXmlApplicationContexts,从而执行Mule引导过程 我的问题是,此XML文件包含多个占位符,这些占位符应根据活动配置文件以不同的方式解决(我已使用不同的配置文件将这些变量存储在application.yml文件中),但applica

我目前正在将现有的应用程序迁移到SpringBoot1.2(使用Mule3;与Spring4.2不兼容)。这个应用程序包含一个提供的库(我无法修改)servlet,它通过读取一些应用程序包含的带有bean定义的XML文件来创建几个ClasspathXmlApplicationContexts,从而执行Mule引导过程

我的问题是,此XML文件包含多个占位符,这些占位符应根据活动配置文件以不同的方式解决(我已使用不同的配置文件将这些变量存储在application.yml文件中),但applicationConfig PropertySource在新应用程序上下文创建的标准环境中不可用

我可以将YML文件转换为.properties文件,并在每个XML文件中创建一个新的PropertyPlaceHolderConfigure,指向同一个应用程序-#{systemProperties['spring.profiles.active']}.properties,但是:

  • 我将失去Boot使用约定和优先级在不同的内部/外部位置定位.properties文件的灵活性,这对于需要在不同环境上迁移的应用程序来说听起来很方便

  • 如果我需要多次添加相同的定义,我想有一种编程方式我忽略了


  • 有人知道我如何将applicationConfig PropertySource的内容添加到所有新创建的ApplicationContexts中,而不必修改创建它们的类吗?Spring Boot 1.2没有Environment PostProcessor的惊人之处。

    供将来参考:我通过实现一个ApplicationListener来解决这个问题,它搜索应用程序配置的所有属性资源,并将其所有属性放在System.getProperties()映射上,所有ApplicationContexts都可以通过在XML文件上设置一个空来解析它们。

    当您创建一个新上下文时,主环境中的所有属性源都可以使用类似的方式添加到新创建的上下文中

    public AnnotationConfigApplicationContext createNewApplicationContext(ConfigurableEnvironment mainEnv) throws IOException {
    AnnotationConfigApplicationContext newContext = new AnnotationConfigApplicationContext();
    //Add scan for your packages
    newContext.scan("com.abc.mycompany");
    //Also Any different profile in association with new context can be added newContext.getEnvironment().addActiveProfile("newProfile");
    mainEnv.getPropertySources().stream().filter(propertySource -> propertySource.getName().startsWith("applicationConfig")).forEach(newContext.getEnvironment().getPropertySources()::addLast);
    newContext.refresh();
    return newContext;
    }
    
    现在,您可以创建任意多个上下文。为了在所有bean创建结束时解决这个问题,您可以@PostConstruct并编写一个包装器方法来调用这个新的上下文生成函数