1

В моем приложении я использую SpringBoot и Spring Batch (и admin). Я также использую файл application.yaml для хранения всех необходимых мне свойств. У меня возникли проблемы с Properties, потому что в SpringBatchAdmin создан PropertyPlaceholderConfigurer компонент, который имеет флаг ignoreUnresolvablePlaceholders, установленный в false. Вот вышеупомянутая боб:IllegalArgumentException с Spring PropertyPlaceholderConfigurer properties flag

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:/org/springframework/batch/admin/bootstrap/batch.properties</value> 
       <value>classpath:batch-default.properties</value> 
       <value>classpath:batch-${ENVIRONMENT:hsql}.properties</value> 
      </list> 
     </property> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="ignoreUnresolvablePlaceholders" value="false" /> 
     <property name="order" value="1" /> 
    </bean> 

Моя проблема заключается в том, что в настоящее время пружинные поиски в этих 3 файлов, чтобы прочитать все свойства, которые извлекаются с помощью @Value аннотацию. Итак, что происходит, так это то, что у меня есть другие зависимости, которые объявили свои собственные свойства, и Spring заставляет меня помещать эти свойства в один из трех файлов, объявленных в компоненте PropertyPlaceholderConfigurer, созданном в SpringBatchAdmin.

Так, например, следующий класс/боб:

@Component 
public class Example{ 
    @Value("${find.me}") 
    private String findMe; 

    ... 
} 

придется искать в следующих 3-х файлов:

batch.properties 
batch-default.properties 
batch-sqlserver.properties 

и если свойство find.me не в одном из них файлов, то я получаю следующее исключение:

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

Я хочу добавить, что проблема НЕ исходит от использования yaml или Spring, не обнаруживая свойство find.me, поскольку, если я не использую SpringBatchAdmin, который создает PropertyPlaceholderConfigurer, свойство «find.me» эффективно находится в моем файле application.yaml.

Кроме того, я не могу изменить вопрос PropertyPlaceholderConfigurer, потому что он исходит из внешнего источника (не моего, а SpringBatchAdmin).

Как я могу это решить?

ответ

0

Вы можете попробовать определения BeanPostProcessor компонент, который устанавливает ignoreUnresolvablePlaceholders поле для true после PropertyPlaceholderConfigurer боба был создан:

@Component 
class PropertyPlaceholderConfig extends BeanPostProcessor { 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof PropertyPlaceholderConfigurer && beanName.equals("placeholderProperties")) { 
      ((PropertyPlaceholderConfigurer) bean).setIgnoreUnresolvablePlaceholders(true); 
     } 

     return bean; 
    } 
}