Может ли Spring PropertyPlaceholderConfigurer игнорировать неустановленные свойства в пути расположения свойства?

У меня есть веб-приложение на основе Spring, запущенное в контейнере Tomcat, и я хочу поддерживать два разных файла конфигурации:

  • src / main / resources / default.properties: содержит значения по умолчанию для разработки, интеграционных тестов и когда другие свойства не установлены
  • ... / tomcat / conf / app.properties: имеет разный контент в разных средах и должен переопределять default.properties

У меня есть весенняя конфигурация, которая работает нормально, когда приложение работает в Tomcat

приложение-context.xml

<context:property-placeholder
    ignore-resource-not-found="true"
    ignore-unresolvable="true"
    system-properties-mode="OVERRIDE"
    location="classpath:default.properties,
              file:${catalina.home}/conf/app.properties"/>

Но когда я пытаюсь использовать эту конфигурацию в интеграционном тесте, вне контейнера Tomcat, загрузка applicationContext завершается неудачно:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308)
    ...
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0' defined in null: Could not resolve placeholder 'catalina.home'
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:287)

Есть ли способ сказать Spring игнорировать файл местоположения:${catalina.home}/conf/app.properties, если свойство catalina.home не установлено в текущем контексте?

3 ответа

Решение

Поскольку у вас есть контекст, где некоторые значения PP могут быть не разрешены, вы можете попробовать использовать default variant для собственности:

file:${catalina.home:}/conf/app.properties

В этом случае префикс пути преобразуется в пустую строку, если нет catalina.home собственности, например, в System.getProperties(), что имеет место для Tomcat, я думаю.

И после этого ignore-resource-not-found="true" делает вещи

Я бы предложил использовать профили Spring для включения / отключения файлов свойств.

При запуске в tomcat swith в профиле "tomcat" или "web" и поместите загрузку app.properties в этот профиль.

Вы можете установить ignore-resource-not-found Для решения этой проблемы.

Попробуй это:

<context:property-placeholder
    ignore-resource-not-found="true"
    ignore-unresolvable="true"
    system-properties-mode="OVERRIDE"
    location="classpath:default.properties,
              file:${catalina.home}/conf/app.properties"/>

Code snippet from spring-context.xsd:

<xsd:attribute name="ignore-resource-not-found" type="xsd:boolean" default="false">
            <xsd:annotation>
                <xsd:documentation><![CDATA[
    Specifies if failure to find the property resource location should be ignored.
    Default is "false", meaning that if there is no file in the location specified
    an exception will be raised at runtime.
                ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
Другие вопросы по тегам