Spring-Boot-Starter-Parent в сочетании с "свойством-заполнителем" в конфигурации Spring на основе XML

В моем POM я наследую от Spring Boot "spring-boot-starter-parent":

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.2.RELEASE</version>
</parent>

В соответствии со следующей документацией Spring Boot Spring Boot Parent изменяет маркер фильтра по умолчанию для maven-resources-plugin с ${maven.token} на @maven.token@, чтобы предотвратить конфликты с заполнителями в стиле Spring. Фон: разделители Spring идентичны разделителям Maven.

Насколько я понимаю: изменение влияет на свойство Maven, а не на расширение свойства Spring. Но может я ошибаюсь и это наоборот?

Теперь, при использовании "context: property-placeholder" в моем конфигурационном файле контекста приложения Spring на основе XML, импортированном через:

@Configuration
@ImportResource("spring/applicationContext-core.xml")
@EnableJpaRepositories
@EnableAutoConfiguration
public class StudyDayApplication {

    /**
     * This main is for using Spring Boot in case of a JAR file packaging.
     * 
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(StudyDayApplication.class, args);
    }
}

расширение свойства ключей, специфичных для Spring, больше не работает. В моем "application-core.xml" я использую специфичное для Spring "свойство-заполнитель", чтобы использовать внешние параметры конфигурации. Но я все еще хочу использовать специфичные для Spring разделители свойств (например, чтобы расширить "jpa.driver.classname" в моем bean-компоненте "dataSource").

...
<context:property-placeholder
        ignore-resource-not-found="false"
        location="classpath*:*.properties"/>
...
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
    <property name="driverClassName" value="${jpa.driver.classname}"/>
...

Но замена в Spring работает только при замене "${jpa.driver.classname}" на "@jpa.driver.classname@"

Согласно следующему замечанию при добавлении следующих атрибутов XML:

order="1"
ignore-unresolvable="true"

к "свойству-заполнителю" я не получаю никаких исключений при запуске Spring Boot, который говорит мне:

"Не удалось разрешить заполнитель" jpa.driver.classname "в строковом значении" $ {jpa.driver.classname} "

Но я уверен, что расширение свойства не работает должным образом, так как "свойство-заполнитель" игнорирует неразрешимые элементы. Это приводит к исключениям позже, когда компоненты будут созданы с использованием нераскрытых ключей свойств. Установка только атрибута "order=1" также не помогает.

Возможно, в Spring Boot нет необходимости явно использовать "свойство-заполнитель", поскольку Spring Boot автоматически ищет "application.properties" в приложении. Но я не хочу переходить на этот подход.

Есть ли способ использовать "spring-boot-starter-parent" и поддерживать типичное расширение свойства Spring активным?

1 ответ

Я нашел свою проблему:-) Этот странный эффект провоцирует не Spring, а моя конфигурация.

Проблема была: файл свойств не был расположен в корневой папке пути к классам, а ниже. И пока файл свойств не загружен, расширение свойства не может быть выполнено.

Чтобы найти все файлы *.properties - даже в подкаталогах, необходимо использовать нотацию в стиле ANT:

<context:property-placeholder
        ignore-resource-not-found="false"
        location="classpath*:**/*.properties"/>

Будьте осторожны: с этим определением все файлы "*.properties" находятся в файлах JAR и во всех подпапках корня classpath. Наконец, они объединяются в один файл свойств. Таким образом, потребление памяти может увеличиться!

Пожалуйста, обратитесь к документации Spring соответственно к следующему комментарию @stackru.com для получения дополнительной информации.

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