0

我有一个用@ConfigurationProperties 注释的类。

@ConfigurationProperties
@Configuration
@DependsOn("AddDefaultProfile")
public class MyProperties(){
 ....
}

我有几个配置文件chrome, safari, ie, and en_US, fr_CA等。我的运行参数看起来像-Dspring.profiles.active=chrome, en_US.

现在我想检查是否指定了语言,如果没有,我使用environment.addActiveProfile("en_US"). 问题是我的 MyProperties 没有重新加载。通过调试,我可以看到环境在活动配置文件中有 en_US,但 propertySource 仍然有旧的配置文件。

如何使用我的新配置文件重新加载 MyProperties。

4

2 回答 2

0

您可以尝试调用此方法WebApplicationContextUtils#initServletPropertySources(org.springframework.core.env.MutablePropertySources, javax.servlet.ServletContext, javax.servlet.ServletConfig),但我不确定这是否有用

于 2018-07-25T03:06:22.513 回答
0

在弹簧靴中,除其他外还有:

  • application.properties(在任何情况下都加载)
  • application-abc.properties(仅当配置文件 abc 处于活动状态时才加载)

这些是可以找到实际值的源文件。

@ConfigurationProperties然而意味着在找到所有要加载的相关文件之后,如何“准备”spring-boot 读取的实际键值以在应用程序中使用(例如,注入标有 的 bean@ConfigurationProperties等)

所以,我想,你应该把默认值放在just中application.properties,并将特定的东西放入application-<profile>.properties

配置文件特定的东西总是优先于默认值,所以你最终会得到以下结果:

  • 未指定配置文件时,将加载application.properties中的内容
  • 指定配置文件时,将从 加载实际值application-<profile>.properties,尽管在application.properties文件中定义了相同的属性键

话虽如此,另一种方法是始终使用配置文件,只需定义一个默认配置文件并显式加载它(--spring.profiles.active=default)并将你的东西保存在application-default.properties

如果您想通过检查其他配置文件不存在以编程方式定义活动配置文件,您可以实现EnvironmentPostProcessor但它已经是一个非常高级的东西

于 2018-07-25T03:31:43.237 回答