Свойство не найдено с несколькими контекстами: свойство-заполнитель
Я использую пружину 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>
Я думаю, что это должно решить вашу проблему.:)
Каждый
Для более подробной информации и предложения, как справиться с этим, смотрите здесь: 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