使用PropertyPlaceholderConfigurer和PropertySource

时间:2015-11-05 14:57:38

标签: java spring spring-annotations

我在这里遇到了一些困难。我正在设计一个实用程序,我要求我的Spring上下文能够将命令行参数视为属性。这很容易做到:

if (args != null && args.length > 0) {
    PropertySource<?> ps = new SimpleCommandLinePropertySource(args);
    ctx.getEnvironment().getPropertySources().addFirst(ps);
}

我遇到的问题是下一步:要符合我的企业框架,我必须设置PropertyPlaceholderConfigurer他们提供 1 。也很容易做到。

@Bean
public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new MyPropertyPlaceholderConfigurer();
}

问题是,一旦设置了后者,之前使用命令行的是什么,我有错误:

  

java.lang.IllegalArgumentException:无法解析占位符&#39; input.file&#39;在字符串值&#34; $ {input.file}&#34;

现在,我知道使用两者远非理想(理想情况下,我甚至不应该使用PropertyPlaceholderConfigurer而是使用PropertySourcesPlaceholderConfigurer)。然而,我对配置器没有选择。

因此,我认为我必须用我的PropertySource改变一些东西,但我不知道如何以优雅的方式做到这一点。我应该延长PropertyPlaceholderConfigurer以添加PropertySource吗?这甚至可能吗?

在这种情况下,最佳解决方案是什么?即使是模糊的线索也是受欢迎的,因为我不知道要走哪条路。

(春季版:4.1.6)

<子> 1。这个PropertyPlaceholderConfigurer加载一些属性文件并应用一些额外的处理(例如,允许在属性文件中加密值)。

1 个答案:

答案 0 :(得分:0)

使用

 ctx.getEnvironment().getPropertySources().addFirst(ps);

你走得正确。

我认为您的MyPropertyPlaceholderConfigurer(来自该企业框架)不仅与PropertySourcesPlaceholderConfigurer兼容。

您应该查看他们的代码并覆盖它以扩展PropertySourcesPlaceholderConfigurer

从另一边PlaceholderConfigurerSupportBeanFactoryPostProcessor,这些人必须配置为静态 @Bean

HTH