Как выглядит Spring свойства / приоритет работает?
Я боролся с этим в течение некоторого времени. Я гуглил и пробовал несколько вещей, но все, что я нашел, не могло решить мою проблему.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" ref="propertiesLocations" />
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
</bean>
И это то, что я имею в качестве своих свойств.
<beans profile="">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="test">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
<value>classpath*:project-test.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
<beans profile="testing">
<util:list id="propertiesLocations">
<value>classpath:com/lala/project/configuration/core.properties
</value>
<value>classpath*:com/lala/project/**/configuration/*.properties
</value> <!-- production properties -->
<value>classpath*:com/lala/project/**/test/configuration/*.properties <!-- test properties -->
</value>
<value>classpath*:project-testing.properties
</value>
<value>classpath*:project.properties
</value>
</util:list>
</beans>
И затем, в одном из моих подпроектов, у меня есть 2 файла свойств, мои "производственные" свойства в
SRC / главный / ресурсы / ком / Лал / проект / subproject1 / subprojectA / конфигурация / myProperties.properties
и мои "тестовые" свойства под
SRC / тест / ресурсы / ком / Лал / проект / subproject1 / subprojectA / тест / конфигурация / myProperties.properties
Очевидно, что эти файлы имеют почти одинаковые имена свойств с разными значениями. Я хотел бы знать, почему мои тесты в подпроекте A продолжают собирать мои "производственные" свойства вместо моих "тестовых" свойств? Другими словами, почему Spring не берет мои "тестовые" свойства и не переопределяет мои "производственные свойства"?
Я забыл упомянуть, что не могу просто стереть местоположение "производственных" свойств для своего тестового профиля, так как мне нужны производственные свойства из других проектов, подпроектов.
2 ответа
Я просто публикую свой ответ на тот случай, если кто-нибудь столкнется с подобной проблемой.
Как я правильно понял, приоритет для расположения файлов свойств работает вниз. Другими словами, местоположение внизу имеет / имеет наибольший приоритет.
НО проблема была не в приоритете поиска, а в способе его поиска. Кажется, что Spring не любит эти две строки:
<value>classpath*:com/lala/project/**/configuration/*.properties
</value>
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
После долгих экспериментов я пришел к выводу, что, поскольку маршруты / местоположения, соответствующие второму регулярному выражению, также соответствуют первому, они учитываются первой строкой, а затем не учитываются во второй строке (I' Я думаю, что процесс поиска, как он обрабатывает строку за строкой сверху вниз).
В итоге я изменил расположение моих тестовых свойств
<value>classpath*:com/lala/project/**/test/configuration/*.properties
</value>
что-то вроде
<value>classpath*:com/lala/project/**/configuration/test/*.properties
</value>
Попробуйте изменить путь свойств теста следующим образом:
file:src/test/resources/com/lala/project/configuration/core.properties