PropertyPlaceholderConfigurer с Tomcat и ContextLoaderListener - PullRequest
1 голос
/ 20 сентября 2011

Я использую PropertyPlaceholderConfigurer с Tomcat & ContextLoaderListener.

Это работает (с именем файла свойств, жестко закодированным):

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/test.properties"/>
</bean>

Но это (с именем файла свойств, замененным на $ {env}):

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties"/>
</bean>

[Thread-2] 15:50:16 ERROR ContextLoader - сбой инициализации контекста org.springframework.beans.factory.BeanInitializationException: не удалось загрузить свойства;вложенное исключение - java.io.FileNotFoundException: ресурс пути к классу [properties / $ {env} .properties] не может быть открыт, потому что он не существует

Я знаю, что файл существует, так как он работает, когда я жестко его кодирую.

Я пытался использовать -Denv = test при запуске Tomcat и установке переменной среды.У меня та же самая вещь, работающая вне Tomcat, использующая мой собственный метод main вместо ContextLoaderListener.

Что я могу делать не так?Могу ли я добиться того же, используя запись в context.xml или web.xml вместо -Denv = test?

Спасибо

PS Я также попробовал:

<bean id="initialcorePropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName">
        <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
    </property>
    <property name="searchSystemEnvironment">
        <value type="boolean">true</value>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<bean id="corePropertyConfigurer" depends-on="initialcorePropertyConfigurer" lazy-init="true"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties" />
</bean>

но я получаю ту же ошибку.

Ответы [ 4 ]

2 голосов
/ 20 сентября 2011

Нельзя использовать заполнитель свойства в определении PropertyPlaceholderConfigurer. Цыпленок-и-яйца.

Однако вы можете использовать #{ systemProperties['env'] }

Или вы можете создать подкласс PropertyPlaceholderConfigurer и переопределить setLocation() для обработки заполнителя.

0 голосов
/ 20 сентября 2011

Был похожий вопрос на этом форуме, где в файле свойств необходимо было получить внешний вид.Проверьте это решение .Похоже, что ваша проблема похожа, вместо передачи env в качестве системной переменной установите ее как переменную env.

0 голосов
/ 20 сентября 2011

Вам необходимо установить переменные среды CATALINA_OPTS или JAVA_OPTS в -Denv = test.Лучший способ сделать это - создать файл setenv.bat (или .sh, если вы используете unix) и добавить туда определение этой переменной среды.

Это не вступит в силу, если вы передадите его в качестве аргументав startup.bat (.sh), который я предполагаю, что вы делаете.

0 голосов
/ 20 сентября 2011

Установите полное местоположение, например -DpropFileLocation=classpath:env1.properties или -DpropFileLocation=classpath:env2.properties, а не только его часть:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="location" value="${propFileLocation}"/>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...