Spring Boot - свойство не может быть разрешено в xml из application.properties
У меня есть приложение весенней загрузки
мой @Configuration class
загружает конфигурацию xml, используя @ImportResource("path/to/xml")
, который содержит следующую строку
<property name="bla" value="${log.directory}/file.ext" />
Под src/main/resources
у меня есть application.properties
файл со следующим содержанием:
log.directory=C:/path/I/Need
Однако при запуске не удается загрузить свойство следующим образом:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'log.directory' in string value "${log.directory}/file.ext
"
1 ответ
Вы можете решить это, добавив context: property-placeholder к вам xml. Таким образом, вы скажете Spring загрузить ваш конкретный файл свойств.
Однако другое, более подходящее для Spring Boot решение, - это просто использовать application.properties в качестве имени файла свойств, располагая его в одном из ожидаемых мест, и использовать аннотацию @EnableAutoconfiguration.
Spring Boot ожидает применение application.properties в следующем расположении в порядке предпочтения.
- Подкаталог A /config текущего каталога.
- Текущий каталог
- Пакет classpath / config
- Корень пути к классам
Я попробовал это, и это работает.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sample</groupId>
<artifactId>sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Sample</name>
<description>Spring Boot sample</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Sample.java
package sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@EnableAutoConfiguration
@ComponentScan
@ImportResource("classpath:beans.xml")
public class Sample implements CommandLineRunner {
@Value("${sample}")
private String sample;
@Autowired
SampleService service;
public static void main(String[] args) {
SpringApplication.run(Sample.class, args);
}
public void run(String... args) {
System.out.println(service.greetings());
}
}
SampleService.java
package sample;
public class SampleService {
private String field;
public String greetings() {
return field;
}
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean class="sample.SampleService">
<property name="field" value="${sample}-world"></property>
</bean>
</beans>
application.properties
sample=hello
В результате вы получите привет, если вы запустите программу.
Убедитесь, что вы включили автоконфигурацию. Если вы этого не сделали, он не будет работать, как ожидалось. Для этого добавьте аннотацию @EnableAutoconfiguration, как в примере.
Обратите внимание, что вы используете Spring Boot, поэтому рекомендуется избегать настройки XML. Вы можете получить тот же результат, не используя beans.xml. Хотя, если вам все еще это нужно, вы можете смешивать XML с аннотациями.
Я загрузил оба примера проектов на GitHub, пожалуйста, проверьте.
https://github.com/plopcas/example-spring-boot/tree/master/spring-boot-xml
https://github.com/plopcas/example-spring-boot/tree/master/spring-boot
Надеюсь это поможет.