Laden Eigenschaften mit Feder (über den System Eigenschaften)
Mein problem ist wie folgt:
Habe ich server.properties
für verschiedene Umgebungen. Den Weg zu diesen Eigenschaften bereitgestellt wird, der durch eine system-property namens propertyPath
. Wie kann ich anweisen, meine applicationContext.xml
zum laden der Eigenschaften mit dem angegebenen propertyPath
system-Eigenschaft ohne hässliche MethodInvokingBean
fordert System.getProperty('');
Meine applicationContext.xml
<bean id="systemPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="placeholderPrefix" value="sys{"/>
<property name="properties">
<props>
<prop key="propertyPath">/default/path/to/server.properties</prop>
</props>
</property>
</bean>
<bean id="propertyResource" class="org.springframework.core.io.FileSystemResource" dependency-check="all" depends-on="systemPropertyConfigurer">
<constructor-arg value="sys{propertyPath}"/>
</bean>
<bean id="serviceProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" ref="propertyResource"/>
</bean>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" ref="propertyResource"/>
<property name="placeholderPrefix" value="prop{"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="ignoreResourceNotFound" value="false"/>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="prop{datasource.name}"/>
</bean>
mit dieser Konfiguration kann der propertyResource alsways beschwert sich über
java.io.FileNotFoundException: sys{propertyPath} (The system cannot find the file specified)
Irgendwelche Vorschläge? 😉
Dank gabe
EDIT:
Ich jetzt ausgetestet, der Ladevorgang der Bohnen und es scheint, die setLocation
Methode der propertyConfigurer
aufgerufen wird, bevor die systemPropertyConfigurer
erstellt wird, damit die propertyResource initialisiert wird mit "sys{propertyPath}".
Ich spielte mit depends-on
aber kein Glück.
- wie genau haben Sie spielen, hängt davon ab,-auf?
- 'propertyResource depends-on="systemPropertyConfigurer"' scheint keinen Einfluss. propertyResource ist erst initialisiert nichtsdestotrotz, vielleicht, weil es bei der Initialisierung mit Konstruktor-arg
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok. Ich löste es. Das problem ist, meine beiden PropertyPlaceholders sind BeanFactoryPostProcessor werden diese verarbeitet, nachdem der Rahmen ist geladen, aber die Eigenschaften festgelegt sind, nach. So es unmöglich ist, füllen Sie eine PropertyPlaceholder mit anderen.
Hier ist meine Lösung im code 😉
Den nach applicationContext.xml Eintrag
den java-Prozess gestartet werden kann mit
und es lädt den Eigenschaften und Sie sind in der applicationContext.xml
Die Lösung zu erweitern PropertyPlaceholderConfigurer scheint ok, aber es sollte auch unter Berufung auf die standard-org.springframework.Bohnen.factory.config.PropertiesFactoryBean Umsetzung ohne das schreiben von zusätzlichem code.
Verwenden Sie einfach die variable Referenz, die gelöst werden bis zum Frühjahr.
z.B.
Konfigurieren Frühjahr wie folgt:
Sobald Sie das aufrufen von Java mit der env-variable (propertyPath), Frühling wird es beheben, laden der property-Datei und injizieren es in den Anwendungskontext
java -DpropertyPath=/path/to/properties
propertyPath
wurde nicht gesetzt werden:${propertyPath:defaultValue}
Haben Sie zwei Möglichkeiten:
verwenden
sys:
als Präfix (und damitsys:propertyPath
)legen Sie die
placeholderSuffix
Eigenschaft des Platzhalters configurer zu}
, so dass Sie Zugriff auf die Eigenschaften mitsys{prop}
. Wenn Sie diese Eigenschaft weglassen, müssen Siesys{prop