2014-10-16 15 views
7

Mam aplikacji bagażnika sprężynaWiosna Boot - nieruchomość nie może być rozwiązany w xml z application.properties

moich @Configuration class obciążeniach konfiguracyjnym XML przy użyciu @ImportResource("path/to/xml"), który zawiera następującą linię

<property name="bla" value="${log.directory}/file.ext" /> 

Pod src/main/resources Mam plik application.properties o następującej treści:

log.directory=C:/path/I/Need 

Jednak podczas uruchamiania go nie można załadować właściwość następująco:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'log.directory' in string value "${log.directory}/file.ext "

+0

Czy masz komponent zastępczy elementu zastępczego właściwości? –

+0

Nie. Czy Spring Boot nie powinien automatycznie ładować pliku application.properties? – mangusbrother

+0

Nie wiem, jak dobrze się załadować. Czy spodziewasz się, że załaduje on wszystkie '.properties' z ścieżki klasy? –

Odpowiedz

8

Można rozwiązać to dodanie kontekstowego: właściciela zastępczy do ciebie xml. W ten sposób powiesz Springowi, aby załadował twój specyficzny plik właściwości.

Kolejnym, bardziej zgodnym z rozwiązaniem Spring Boot, jest użycie application.properties jako nazwy pliku właściwości, posiadanie go w jednej z oczekiwanych lokalizacji i użycie adnotacji @EnableAutoconfiguration.

Spring Boot oczekuje pliku application.properties w następującej lokalizacji w kolejności preferencji.

  1. Podkatalog A/config bieżącego katalogu.
  2. Bieżący katalog
  3. ścieżkę klasy/config korzeń pakiet
  4. ścieżce klasy

Próbowałem to i to działa.

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 

W wyjściu dostaniesz Hello World jeśli uruchomić program.

Upewnij się, że została włączona autokonfiguracja. Jeśli nie, to nie będzie działać zgodnie z oczekiwaniami. Aby to zrobić, dodaj adnotację @EnableAutoconfiguration tak jak w przykładzie.

Należy pamiętać, że używasz Spring Boot, więc zachęcamy do uniknięcia konfiguracji XML. Możesz uzyskać ten sam wynik bez fasoli.xml. Chociaż, jeśli nadal potrzebujesz, możesz mieszać XML z adnotacjami.

Załadowałem oba przykładowe projekty do GitHub, proszę sprawdzić.

https://github.com/plopcas/example-spring-boot/tree/master/spring-boot-xml

https://github.com/plopcas/example-spring-boot/tree/master/spring-boot

Nadzieja to pomaga.

+1

Miałem już działającą konfigurację bean.xml i potrzebowałem tylko tego, aby wykonać to przy użyciu wiosennego rozruchu. Problem polegał na tym, że musiałem dodać mangusbrother

+0

OK, tak, z kontekstem: obiekt zastępczy to równie dobrze działa. Jest to szczególnie przydatne, gdy plik właściwości nazywa się coś innego niż application.properties. Ponadto, twoje dodatkowe atrybuty order = "1" ignore-unresolvable = "true" są przydatne, gdy masz więcej niż jeden plik właściwości. –

+0

Ale jak widać w moim projekcie GitHub, st-springboot, nie jest to wymagane, ponieważ konwencja dotycząca konfiguracji Spring Boot jest korzystniejsza. Ale możesz też mieć plik bean.xml i miksować adnotacje z konfiguracją xml (st-springboot-xml), a Spring Boot wybierze plik application.properties automatycznie, zakładając, że włączyłeś autokonfigurację (@EnableAutoconfiguration). Zaktualizowałem odpowiedź, aby to podkreślić. W każdym razie, cieszę się, że rozwiązałeś problem. Jeśli masz czas, sprawdź projekty, ponieważ uważam, że jest to bardziej konkretna odpowiedź na twoje pytanie. Pozdrowienia. –