同时使用 PropertyPlaceholderConfigurer 和 PropertySource

Using both PropertyPlaceholderConfigurer and PropertySource

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

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

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

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

问题是,一旦设置了后者,之前使用命令行工作的东西就不行了,我有错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'input.file' in string value "${input.file}"

现在,我知道同时使用两者远非理想(理想情况下,我什至不应该使用 PropertyPlaceholderConfigurer,而是 PropertySourcesPlaceholderConfigurer)。然而,对于配置器,我别无选择。

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

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

(Spring 版本: 4.1.6)


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

随着

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

你走对了。

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

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

从另一边 PlaceholderConfigurerSupportBeanFactoryPostProcessor 并且这些家伙必须配置为 static @Beans.

HTH