2010-03-25 19 views
80

Wir sind mit einem PropertyPlaceholderConfigurer Java-Objekte in unserer Spring-Konfiguration (details here)Gibt es eine Möglichkeit, einen Standardeigenschaftswert in Spring XML anzugeben?

zB verwenden:

<foo name="port"> 
    <value>${my.server.port}</value> 
</foo> 

Wir möchten eine zusätzliche Eigenschaft hinzufügen, aber haben ein verteiltes System, in dem die vorhandenen Instanzen könnte alle einen Standardwert verwenden. Gibt es eine Möglichkeit, die Aktualisierung all unserer Eigenschaftendateien zu vermeiden, indem ein Standardwert in der Spring-Konfiguration angegeben wird, wenn kein überschreibender Eigenschaftswert definiert ist?

Antwort

13

Suchen Sie die PropertyOverrideConfigurer

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

Die PropertyOverrideConfigurer, andere BeanFactory Postprozessor hier dokumentiert, zum PropertyPlaceholderConfigurer ähnlich ist, aber in Gegensatz zu diesem, Die ursprünglichen Definitionen können Standardwerte haben oder keine Werte für Bean-Eigenschaften. Wenn eine überschreibende Eigenschaftendatei keinen Eintrag für eine bestimmte Bean- -Eigenschaft enthält, wird die Standardkontextdefinition verwendet.

+0

Kann mir jemand erklären, was ein '18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA' ist? Ich bin mir sicher, dass jeder andere weiß und ich bin nur dumm, aber nur für den Fall ... –

237

Feder 3 unterstützt ${my.server.port:defaultValue} Syntax.

+8

Nur für die Referenz: [SPR-4785] (https://jira.springsource.org/browse/SPR-4785) – cubanacan

+8

Für mich überschreibt es immer die Eigenschaft mit dem Standardwert, unabhängig davon, ob die Eigenschaft definiert ist oder nicht. –

+0

Es funktioniert gut für mich! –

8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html weist darauf hin, dass „lokale Eigenschaften“ auf der Bohne selbst definierten Vorgaben berücksichtigt werden, indem Werte von Dateien lesen Sie außer Kraft gesetzt werden:

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"><value>my_config.properties</value></property> 
    <property name="properties"> 
    <props> 
     <prop key="entry.1">123</prop> 
    </props> 
    </property> 
</bean> 
+0

thx, darüber gab es im frühling javadoc, aber ich konnte mir nicht vorstellen, wie es geht! – Guillaume

20

Es gibt eine wenig bekannte Funktion ist, die thi macht s noch besser. Sie können anstelle eines hartcodiert man einen konfigurierbaren Standardwert verwenden, hier ist ein Beispiel:

config.properties:

timeout.default=30 
timeout.myBean=60 

context.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>config.properties</value> 
    </property> 
</bean> 

<bean id="myBean" class="Test"> 
    <property name="timeout" value="${timeout.myBean:${timeout.default}}" /> 
</bean> 

Standard verwenden Sie können dies später problemlos in der Datei config.properties tun:

timeout.myBean = ${timeout.default} 
4

Verwenden Sie ?:, nämlich die Elvis Operator:

<property name="port"> 
    <value>${my.server.port?:8080}</value> 
</property> 

<!-- OR --> 
<property name="port" value="${my.server.port?:8080}" /> 

Es ist eine Abkürzung für den ternären Operator, available seit Spring 3.0 und hat eine Verbindung zu the same operator in Groovy.

Verwandte Themen