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 для получения дополнительной информации.