Свойство не найдено с несколькими контекстами: свойство-заполнитель

Я использую пружину 3.1 с пружинными профилями для загрузки бобов. В моем файле контекста приложения я загружаю свойства, такие как:

<context:property-placeholder order="1"  location="classpath*:META-INF/spring/*_${spring.profiles.active}.properties" ignore-unresolvable="true"/>

А затем я использую значение свойства для загрузки компонента источника данных, как

<property name="driverClassName" value="${database.driverClassName}"/>

Работает нормально. Проблема начинается, когда я добавляю еще пару заполнителей свойств, чтобы можно было загружать свойства из некоторых таблиц базы данных.

При этом используется ссылка на свойства, загруженная

<bean id="configFactoryBean"
class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean">
   <constructor-arg ref="globalSystemConfiguration"/>
</bean>

Чтобы добавить к деталям, это configFactoryBean использует datasource загрузить свойства из базы данных.

Когда я делаю это, у меня есть следующее исключение:

java.lang.ClassNotFoundException: ${database.driverClassName}

Мой анализ заключается в том, что его пытается загрузить datasource перед разрешением свойства из первого контекстного свойства заполнителя. Я могу ошибаться Или, возможно, переменная профиля пружины не разрешена должным образом.

Может кто-нибудь, пожалуйста, помогите мне исправить это.

Спасибо акки

4 ответа

Эта ошибка в заполнителях нескольких свойств может относиться к вашей проблеме: https://jira.spring.io/browse/SPR-9989

При использовании нескольких PropertyPlaceholderConfigurer в сочетании с @Value аннотация и значение по умолчанию для синтаксиса заполнителей (т.е. ${key:defaultValue}), только первый PropertyPlaceholderConfigurer используется. Если этот конфигуратор не содержит желаемого значения, он возвращается к @Value по умолчанию, даже если второй PropertyPlaceholderConfigurer содержит значение

Влияет на версию / версии 3.1.3

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

<bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="locations">
            <list>
                <value>classpath*:META-INF/spring/*_${spring.profiles.active}.properties</value>
            </list>
          </property>
    </bean>

Я думаю, что это должно решить вашу проблему.:)

Каждый создает новый экземпляр PropertyPlaceholderConfigurer - он легко запутывается. Вы должны иметь одну такую ​​вещь для каждого приложения и на уровне приложения, а не на уровне библиотеки - это значительно упрощает обслуживание.

Для более подробной информации и предложения, как справиться с этим, смотрите здесь: http://rostislav-matl.blogspot.cz/2013/06/resolving-properties-with-spring.html

Поскольку вы предложили жестко прописать путь к файлу конфигурации, попробуйте использовать атрибут profile в теге, чтобы выборочно включить конфигурацию.

<beans profile="profileName">
    <context:property-placeholder  order="1"  location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/>
</beans>

<beans profile="profileName2">    
    <context:property-placeholder order="1"  location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/>
</beans>

См. Эту статью с пояснениями к профилям: http://java.dzone.com/articles/using-spring-profiles-xml

Другие вопросы по тегам