我们使用Spring和PropertySourcesPlaceholderConfigurer
来连接我们的属性。目前,我们已将setIgnoreUnresolvablePlaceholders
设置为true
,这样,如果资产缺失,应用就可以继续使用。
虽然我认为让应用程序崩溃会更好,但我们发现此时风险很大,所以我们想要一个中间解决方案:警告缺少属性。
我们希望警告或错误级别的日志消息缺少某个属性,但该应用仍应尽最大努力启动。
这在Spring 4和Java 8中是否可行?
答案 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");
也许不是最简单的解决方案......