2013-05-10 19 views
6

Czytałem podobne problemy na stacoverflow.com, ale żadne z rozwiązań nie pomogło mi. Poniższa konfiguracja używam (struktura projektu Maven): src/main/resources/properties/app.properties plikZastępczynik właściwości wiosennych nie działa

#possible values: dev test prod 
mode: dev 

W konfiguracji Wiosna:

<context:property-placeholder location="classpath:properties/app.properties"/> 
<import resource="classpath:/spring/db/${mode}-datasource-config.xml"/> 

podstawie wartości ${mode} chcę zaimportować odpowiedni plik konfiguracji źródła danych.

Kiedy uruchomić wbudowany tomcat7 używając komendy mvn clean install tomcat7:run Dostaję błąd:

10, 2013 5:52:29 PM org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet /SpringWebFlow threw load() exception 
java.lang.IllegalArgumentException: Could not resolve placeholder 'mode' in string value "classpath:/spring/db/${mode}-datasource-config.xml" 

Plik target/classes/properties/app.properties istnieje.

Używam IntelliJ IDEA i w edytorze mogę kliknąć "$ {mode}" w <import resource="classpath:/spring/db/${mode}-datasource-config.xml"/> i zobaczyć jego wartość w pliku właściwości. Również sam redaktor zmienia ${mode} na szary kolor dev pokazując, że może rozpoznać wartość właściwości. W edytorze widzę: <import resource="classpath:/spring/db/dev-datasource-config.xml"/>

Jakieś pomysły, dlaczego otrzymuję błąd i jak można go rozwiązać?

+0

Która wersja Wiosna używacie: <3.1 or > = 3,1? – Ralph

+0

@Ralph, 3.2.2.RELEASE Alexandr

Odpowiedz

12

Właściwości zastępcze w importach są rozwiązywane tylko na podstawie zmiennych środowiskowych lub właściwości systemu.

Od wersji 3.1 można użyć numeru ApplicationContextInitializer, aby dodać PropertySources do Enviroment, który rozwiąże problem.

zobaczyć http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/

Inna możliwość zrobić to samo jest przy użyciu profili: http://blog.springsource.org/2011/02/14/spring-3-1-m1-introducing-profile/

Edytuj

Na przykład:

Dodaj do inicjatora web.xml

<context-param> 
    <param-name>contextInitializerClasses</param-name> 
    <param-value>foo.bar.AppContextInitializer</param-value> 
</context-param> 

A Inicjator:

public class AppContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> { 

     @Override 
     public void initialize(ConfigurableWebApplicationContext applicationContext) { 
      Properties props; 
      try { 
       props = PropertiesLoaderUtils.loadAllProperties("/some/path"); 
       PropertiesPropertySource ps = new PropertiesPropertySource("profile", props); 
       applicationContext.getEnvironment().getPropertySources().addFirst(ps); 
      } catch (IOException e) { 
       // handle error 
      } 
     } 
    } 
+0

Nie jestem silny na wiosnę. Czy mogę odłączyć ApplicationContextInitializer od wersji declatively w pliku konfiguracyjnym Spring? Nie sądzę, że trzeba go zaimplementować tylko do ładowania plików właściwości. Nie mogę znaleźć żadnego przykładu. Widzę tylko implementacje java. – Alexandr

+0

Nie, nie możesz tego zrobić deklaratywnie. 'PropertyPlaceHolderConfigurer' lub' PropertySourcesPlaceholderConfigurer' to 'BeanFactoryPostProcessors', więc importowanie jest wcześniej przetwarzane. –

+0

+1: dla linku http: //blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ – Ralph

2

Jest to format pliku właściwości ważne? Myślę, że należy użyć następującej treści dla app.properties:

#possible values: dev test prod 
mode=dev 
Powiązane problemy