2016-08-10 3 views
1

Мы используем Spring и PropertySourcesPlaceholderConfigurer для прокладки наших объектов. В настоящее время мы установили setIgnoreUnresolvablePlaceholders в true, который позволяет приложению просто продолжить, если свойство отсутствует.Предупреждать о недостающих свойствах пружины

Хотя я считаю, что лучше просто свернуть приложение, мы считаем это рискованным на данный момент, поэтому мы хотели бы получить промежуточное решение: предупредить о недостающих свойствах.

Мы хотели бы сообщить сообщение на уровне предупреждений или ошибок, что свойство отсутствует, но приложение должно приложить все усилия, чтобы начать.

Возможно ли это весной 4 и Java 8?

+0

было бы неплохо разделить код .. таким образом мы имеем четкое представление о что вы говорите – Sohlowmawn

ответ

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"); 

Может быть, не самое простое решение ...

+0

Спасибо, это сработало. Оказалось, что существует множество строк, разрешаемых (главным образом имена пакетов, пустые строки и т. Д.) Весной рамки, поэтому мне пришлось отфильтровать это. Я добавил регулярное выражение для весенних заполнителей –

Смежные вопросы