【问题标题】:How to override Spring 3.1 @PropertySource to set IgnoreResourceNotFound & IgnoreUnresolvablePlaceholders如何覆盖 Spring 3.1 @PropertySource 以设置 IgnoreResourceNotFound 和 IgnoreUnresolvablePlaceholders
【发布时间】:2012-12-22 20:51:20
【问题描述】:

让这个类覆盖另一个 Config 类中已经设置的 @PropertySource。

@Configuration
@PropertySource({ "classpath:${env.placeholder}/app.properties" })
public class PropertyOverrideConfig {

}

但只要文件或占位符丢失,上下文加载就会失败。我需要为该注释加载的属性设置以下标志,以便在找不到该属性时跳过。

        setIgnoreResourceNotFound(true);
        setIgnoreUnresolvablePlaceholders(true);

问题 1:为@PropertySource 设置这些标志的合适方法是什么?

更新: 尝试在没有引用 this 页面的注释的情况下将 @Bean 添加到同一类,它也没有选择属性文件。我没有xml配置。

@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
     final PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();

     Resource[] resources = new ClassPathResource[ ] { 
                  new ClassPathResource( "classpath:${env.placeholder}/app.properties" ) };

     pspc.setLocations( resources );
     pspc.setIgnoreResourceNotFound(true);
     pspc.setIgnoreUnresolvablePlaceholders(true);
     return pspc;
}

问题2:我确定我遗漏了一些东西,但无法弄清楚它是什么,任何帮助都会很棒。

【问题讨论】:

  • 您确定没有注册其他 PropertySourcesPlaceholderConfigurer 实例吗?也许您应该将返回 PropertySourcesPlaceholderConfigurer 的 @Bean 带注释的方法设为静态(如 @Bean 的 java 文档所建议的那样)
  • 感谢@BorisTreukhov,我在发帖时错过了静态。同时,如果我有相同的PropertySourcesPlaceholderConfigurer 已经在不同的配置上注册了 bean,会发生什么?
  • 我记不太清了,但是你可以有几个 PropertySourcesPlaceholderConfigurers(并为它们指定不同的占位符前缀/后缀)——也许还有另一个占位符配置器抱怨无法解析的占位符
  • 至于丢失的文件,我认为它是由属性源框架生成的,而不是由后处理器生成的。
  • 当我有@Bean 定义时,我没有收到任何错误,只是没有使用我在其中提到的属性文件。除了在 app.properties 中找不到属性的错误之外,没有错误。

标签: java spring spring-mvc properties configuration


【解决方案1】:

我想我终于找到了问题1的答案:

如何为通过@PropertySource 添加的属性设置忽略标志?

它还没有在 Spring 中出现,它被提议为 Minor 改进。希望能够看到一个额外的属性 即将在未来版本中添加到注释中。

SPR-8371

仍然不确定完成上述场景的方法,也没有回答问题 2。

【讨论】:

  • 还有SPR-10325:“允许@PropertySource 上的ignoreResourceNotFound”,投一票吧!
【解决方案2】:

如果您必须坚持使用 Spring 3,则不是真正的解决方案,而是一种解决方法:使用存在的虚拟默认值,即在您的情况下:

@PropertySource({ "classpath:${env.placeholder:dummy}/app.properties" })

【讨论】:

    【解决方案3】:

    尝试删除classpath:,使用ClassPathResource时不需要:

    new ClassPathResource( "classpath:${env.placeholder}/app.properties" ) };
    

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 2016-08-05
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2014-10-10
      • 2016-10-01
      相关资源
      最近更新 更多