4 Stimmen

Verwendung von Eigenschaften in spring config

Ich habe eine Eigenschaftskonfiguration, die von meiner Umgebung abhängt, wie folgt:

 <bean id="someConfigurer" 
       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">  
        <list> 
            <value>classpath:properties/database.${my.env}.properties</value>
            <value>classpath:properties/morestuff.${my.env}.properties</value>
            [..]
        </list>  
    </property>
</bean>

Jetzt kann ich verschiedene Eigenschaftsdateien in meinem Projekt behalten, zum Beispiel datenbank.prod.properties o datenbank.qual.properties . Dies funktioniert gut, wenn ich meine Anwendung mit -Dmy.env=foobar starte.

Was passiert, wenn keine Umgebung geliefert wird? Die Anwendung lässt sich nicht starten, weil der PropertyPlaceholderConfigurer eine FileNotFoundException auslöst. Ich möchte nicht eine Kopie aller Eigenschaftsdateien als Ausweichmöglichkeit aufbewahren. Was ich möchte, ist eine Umgebung als Fallback zu setzen, wenn die Systemeigenschaft nicht gesetzt ist.

Ich habe versucht, dies mit einem zweiten PropertyPlaceholderConfigurer wie zu lösen:

<bean id="fallbackPropertyConfigurer"  
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">  
        <list>  
            <value>classpath:properties/default-env.properties</value>
        </list>  
    </property>
    <property name="order" value="0" />
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>   

standard-env.properties besteht nur aus einer Eigenschaft: my.env=qual .

Die Reihenfolge ist auf '0' gesetzt, um sicher zu sein, dass diese Bohne zuerst ausgewertet wird. Ich erhalte immer noch die folgende Ausnahme:

DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Searching for key 'my.env' in [systemProperties]
DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Searching for key 'my.env' in [systemEnvironment]
DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Could not find key 'my.env' in any property source. Returning [null]
DEBUG  o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'someConfigurer'
INFO   o.s.b.f.c.PropertyPlaceholderConfigurer - Loading properties file from class path resource [properties/default-env.properties]
INFO   o.s.b.f.c.PropertyPlaceholderConfigurer - Loading properties file from class path resource [properties/database.${my.env}.properties]
INFO   o.s.b.f.s.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@435a3a: defining beans [fallbackPropertyConfigurer,someConfigurer,[..],org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [properties/database.${my.env}.properties] cannot be opened because it does not exist
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:87)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
    [..]

Wenn ich den PropertyPlaceholderConfigurer auskommentieren, um die Fehler loszuwerden, kann ich verwenden %{my.env} in anderen Bohnen.

Kann jemand dieses Verhalten erklären?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X