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 в следующем расположении в порядке предпочтения.

  1. Подкаталог A /config текущего каталога.
  2. Текущий каталог
  3. Пакет classpath / config
  4. Корень пути к классам

Я попробовал это, и это работает.

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

Надеюсь это поможет.

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