当前位置: 首页 > 知识库问答 >
问题:

Spring(非引导)从多个项目加载多个yml文件

卢文博
2023-03-14

这是一个直接的多项目分级构建--为了简单起见--包含两个项目。一个项目是“主要”的Spring项目-IE。Spring上下文在此项目中初始化。另一个是带有一些数据库实体和数据源配置的“支持”模块。我们使用基于注释的配置。

我希望能够在支持模块中定义一组配置属性,并且根据活动的spring配置文件,相应地加载数据源配置。

这篇SA帖子让我在不同的答案中找到了不同的链接,并从这篇文章中找到了我的解决方案。结构和代码如下:

mainproject
  src
    main
      groovy
        Application.groovy
    resourcers
      application.yml

submodule
  src
    main
      groovy
        PropertiesConfiguration.groovy
        DataSource.groovy
    resources
      datasource.yml
@Configuration
class PropertiesConfiguration {

    @Bean
    public PropertySourcesPlaceholderConfigurer configure() {
        PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer()
        YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean()
        yamlPropertiesFactoryBean.setResources(new ClassPathResource("datasource.yml"))
        configurer.setProperties(yamlPropertiesFactoryBean.getObject())
        return configurer
    }
}
@Autowired
Environment env

datasource.username = env.getProperty("datasource.username")
---
spring:
  profiles: development

datasource:
  username: sa
  password:
  databaseUrl: jdbc:h2:mem:tests
  databaseDriver: org.h2.Driver

我可以从Application.groovy使用调试器检查我的ApplicationContext,并确认我的PropertySourcesPlaceHolderConfigureer存在并且加载了值。正在检查ApplicationContext.Environment.PropertySources它不在那里。

我错过了什么?

共有1个答案

靳金鹏
2023-03-14

使用PropertySourcesPlaceHolderConfigureer不会向环境添加属性。在配置类的类级别上使用类似@PropertySource(“classpath:something.properties”)的东西将向Environment添加属性,但遗憾的是,这不适用于YAML-文件。

因此,您必须手动将从YAML文件中读取的属性添加到环境中。这里有一种方法可以做到这一点:

@Bean
public PropertySourcesPlaceholderConfigurer config(final ConfigurableEnvironment confenv) {
    final PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
    yamlProperties.setResources(new ClassPathResource("datasource.yml"));
    configurer.setProperties(yamlProperties.getObject());

    confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));

    return configurer;
}

使用此代码,您可以以以下两种方式中的任何一种注入属性:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PropertiesConfiguration.class)
public class ConfigTest {

    @Autowired
    private Environment environment;

    @Value("${datasource.username}")
    private String username;

    @Test
    public void props() {
        System.out.println(environment.getProperty("datasource.username"));
        System.out.println(username);
    }
}

使用问题中提供的属性,这将打印“sa”两次。

编辑:现在似乎并不实际需要PropertySourcesPlaceHolderConfigureer,因此可以将代码简化为如下所示,并且仍然生成相同的输出。

@Autowired
public void config(final ConfigurableEnvironment confenv) {
    final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
    yamlProperties.setResources(new ClassPathResource("datasource.yml"));

    confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));
}

编辑2:

@Autowired
public void config(final ConfigurableEnvironment confenv) {
    final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();

    yamlProperties.setResources(new ClassPathResource("datasource-" + confenv.getActiveProfiles()[0] + ".yml"));

    confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));
}
@Autowired
public void config (final ConfigurableEnvironment confenv) {
    final YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader();
    try {
        final PropertySource<?> datasource =
                yamlPropertySourceLoader.load("datasource",
                                            new ClassPathResource("datasource.yml"),
                                            confenv.getActiveProfiles()[0]);
        confenv.getPropertySources().addFirst(datasource);
    } catch (final IOException e) {
        throw new RuntimeException("Failed to load datasource properties", e);
    }
}
 类似资料:
  • 在Spring Boot中,我知道我可以替换应用程序。属性与应用程序。yml并使用YAML格式。然而,我的申请。yml越来越拥挤了,所以我需要把它分开一点。我该怎么做?我想这样做:

  • 问题内容: 我只是想知道,是否有可能同时将多个项目导入Eclipse。因为每当创建新工作区时,都必须将所需的项目从旧工作区导入到新创建的工作区中。 因此,很高兴知道是否存在同时导入多个项目的选项? 谢谢。 问题答案: 如果所有旧项目都存在于单个目录或单个父目录中,则可以执行 File- > Import …-> Existing Projects intoworkspace 。选择一个根目录,该目

  • 我有一个使用Spring引导的Spring批处理作业,它有2个数据源。每个数据源也有2个架构。我需要为这两个数据源指定默认模式。我知道属性spring.jpa.properties.hibernate.default_schema我使用它来指定一个数据源的默认模式。有没有办法为另一个模式指定默认模式? 目前,要为其他数据源指定默认模式,我使用更改会话查询来根据需要切换模式。我试图摆脱这个改变会话查

  • 调用配置 我在构造函数中得到了一个NullPointerException。

  • 用PySimpleGUI一次可以选择多个文件路径吗 只能选择一个文件 null 没有循环模式的多个文件的任何API?

  • 在所有的例子代码中,我们在引导过程中通过 handler() 或childHandler() 都只添加了一个 ChannelHandler 实例,对于简单的程序可能足够,但是对于复杂的程序则无法满足需求。例如,某个程序必须支持多个协议,如 HTTP、WebSocket。若在一个 ChannelHandle r中处理这些协议将导致一个庞大而复杂的 ChannelHandler。Netty 通过添加多