警告缺少Spring属性

时间:2016-08-10 10:03:49

标签: java spring

我们使用Spring和PropertySourcesPlaceholderConfigurer来连接我们的属性。目前,我们已将setIgnoreUnresolvablePlaceholders设置为true,这样,如果资产缺失,应用就可以继续使用。

虽然我认为让应用程序崩溃会更好,但我们发现此时风险很大,所以我们想要一个中间解决方案:警告缺少属性。

我们希望警告或错误级别的日志消息缺少某个属性,但该应用仍应尽最大努力启动。

这在Spring 4和Java 8中是否可行?

1 个答案:

答案 0 :(得分:2)

查看PropertySourcesPlaceHolderConfigurer的来源,特别是processProperties方法:

protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
        final ConfigurablePropertyResolver propertyResolver) throws BeansException {

    propertyResolver.setPlaceholderPrefix(this.placeholderPrefix);
    propertyResolver.setPlaceholderSuffix(this.placeholderSuffix);
    propertyResolver.setValueSeparator(this.valueSeparator);

    StringValueResolver valueResolver = new StringValueResolver() {
        @Override
        public String resolveStringValue(String strVal) {
            String resolved = (ignoreUnresolvablePlaceholders ?
                    propertyResolver.resolvePlaceholders(strVal) :
                    propertyResolver.resolveRequiredPlaceholders(strVal));
            if (trimValues) {
                resolved = resolved.trim();
            }
            return (resolved.equals(nullValue) ? null : resolved);
        }
    };

    doProcessProperties(beanFactoryToProcess, valueResolver);
}

您可以看到它包含一个简单的检查 您还可以看到该方法受保护 然后解决方案是创建自己的PropertySourcesPlaceHolderConfigurer子类,它会覆盖该方法。 它包含完全相同的代码......但会记录警告。

所以

String resolved = (ignoreUnresolvablePlaceholders ?
        propertyResolver.resolvePlaceholders(strVal) :
        propertyResolver.resolveRequiredPlaceholders(strVal));

然后变成

String resolved = (ignoreUnresolvablePlaceholders ?
        propertyResolver.resolvePlaceholders(strVal) :
        propertyResolver.resolveRequiredPlaceholders(strVal));
if(strVal.equals(resolved)) {
    LOG.warn("Property "+ strVal+ " could not be found");

也许不是最简单的解决方案......