Как работают свойства 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>

И это то, что у меня есть в качестве свойств Locations.

<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/main/resources/com/lala/project/subproject1/subprojectA/configuration/myProperties.properties

и мои "тестовые" свойства под

src/test/resources/com/lala/project/subproject1/subprojectA/test/configuration/myProperties.properties

Очевидно, что эти файлы имеют почти одинаковые имена свойств с разными значениями. Я хотел бы знать, почему мои тесты в подпроекте продолжают использовать мои «производственные» свойства вместо моих «тестовых» свойств? Другими словами, почему Spring не выбирает мои «тестовые» свойства и не переопределяет мои «производственные свойства»?

Я забыл упомянуть, что я не могу просто стереть местоположение свойств «производство» для своего тестового профиля, так как мне нужны свойства производства из других проектов, подпроектов.


person acrespo    schedule 26.06.2015    source источник


Ответы (2)


Я просто публикую свой собственный ответ на случай, если кто-то наткнется на подобную проблему.

Как я правильно понял, приоритет расположения файлов свойств работает вниз. Другими словами, расположение внизу имеет/имеет наибольший приоритет.

НО проблема заключалась не в приоритете поиска, а в том, как выполняется поиск. Похоже, что Spring не нравятся эти две строки:

    <value>classpath*:com/lala/project/**/configuration/*.properties
    </value>
    <value>classpath*:com/lala/project/**/test/configuration/*.properties
    </value>

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

Итак, в итоге я изменил расположение моих тестовых свойств с чего-то вроде

    <value>classpath*:com/lala/project/**/test/configuration/*.properties
    </value>

к чему-то вроде

    <value>classpath*:com/lala/project/**/configuration/test/*.properties
    </value>
person acrespo    schedule 30.06.2015

попробуйте изменить путь к свойствам теста следующим образом:

file:src/test/resources/com/lala/project/configuration/core.properties
person maframaran    schedule 26.06.2015
comment
Я пробовал это, но безуспешно :(. Это не было идеальным решением, но я думал, что, по крайней мере, оно должно работать... Это то, что я думаю, что я не совсем понимаю, как работают свойства пружины - person acrespo; 26.06.2015
comment
Где вы загружаете свои файлы свойств? У вас есть два разных контекста приложения (один для тестирования, а другой реальный)? Я думаю, вы всегда загружаете один и тот же контекст приложения. Покажите нам свою структуру каталогов. - person maframaran; 26.06.2015