Gibt es eine Möglichkeit, einen Standardeigenschaftswert in Spring XML anzugeben?

Lesezeit: 4 Minuten

Wir verwenden eine PropertyPlaceholderConfigurer um Java-Eigenschaften in unserer Spring-Konfiguration zu verwenden (Details hier)

z.B:

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

Wir würden gerne eine zusätzliche Eigenschaft hinzufügen, haben aber ein verteiltes System, in dem vorhandene Instanzen alle einen Standardwert verwenden könnten. Gibt es eine Möglichkeit, die Aktualisierung aller unserer Eigenschaftendateien zu vermeiden, indem Sie einen Standardwert in der Spring-Konfiguration angeben, wenn kein überschreibender Eigenschaftswert definiert ist?

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

  • Nur als Hinweis: SPR-4785

    – Cubacan

    11. Januar 2013 um 9:37 Uhr

  • Für mich überschreibt es immer die Eigenschaft mit dem Standardwert, egal ob die Eigenschaft definiert ist oder nicht.

    – Ondrej Bozek

    1. November 2013 um 13:55 Uhr

  • @OndrejBozek – (Entschuldigung, dass ich einen alten Beitrag stoße) Ich bin auf dasselbe Problem gestoßen, siehe Spring Framework-Problem [jira.spring.io/browse/SPR-9989]. Wenn mehrere Platzhalter-Konfiguratoren beteiligt sind, werden Standardwerte, die mit der Notation „:“ angegeben sind, nur vom ersten Platzhalter-Konfigurator in der Kette aufgelöst. Wenn also der erste Konfigurator die Eigenschaft nicht hat, wird die Eigenschaft immer auf den Standardwert gesetzt, selbst wenn Konfiguratoren weiter unten in der Kette die Eigenschaft haben. Sehen [stackoverflow.com/a/22452984/599609]

    – Töne

    15. Januar 2015 um 2:42 Uhr


  • es scheint ${my.server.port:-defaultValue} gibt auch das gleiche Ergebnis, beachten Sie die “:-” im Gegensatz zu “:“.

    – Kapitän Mann

    12. April 2016 um 13:54 Uhr

  • Sie müssen hinzufügen <context:property-placeholder/> damit dies funktioniert, oder fügen Sie a hinzu PropertyPlaceholderConfigurer

    – shuckc

    1. Februar 2017 um 11:09 Uhr


Benutzer-Avatar
Michael Böckling

Es gibt eine wenig bekannte Funktion, die dies noch besser macht. Sie können einen konfigurierbaren Standardwert anstelle eines fest codierten verwenden, hier ist ein Beispiel:

config.properties:

timeout.default=30
timeout.myBean=60

Kontext.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>

Um die Standardeinstellung zu verwenden und sie später immer noch einfach überschreiben zu können, tun Sie dies in config.properties:

timeout.myBean = ${timeout.default}

  • Das hat bei mir funktioniert ${timeout.myBean:${timeout.default}}. Dadurch konnte mein Standardwert auch eine Variable sein.

    – NeuesterStackOverflowUser

    17. Dezember 2018 um 15:09 Uhr

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

sollte funktionieren, damit Sie 8088 als Standardport haben

Siehe auch:
http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/

Benutzer-Avatar
JoseK

Suchen Sie den hier dokumentierten PropertyOverrideConfigurer

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

Der PropertyOverrideConfigurer, ein weiterer Bean-Factory-Postprozessor, ähnelt dem PropertyPlaceholderConfigurer, aber im Gegensatz zu letzterem können die ursprünglichen Definitionen Standardwerte oder überhaupt keine Werte für Bean-Eigenschaften haben. Wenn eine überschreibende Eigenschaftendatei keinen Eintrag für eine bestimmte Bean-Eigenschaft enthält, wird die Standardkontextdefinition verwendet.

Benutzer-Avatar
Ryenus

Dem Standardwert kann ein gefolgt werden : nach dem Eigenschaftsschlüssel, z

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

Oder im Java-Code:

@Value("${my.server.port:8080}")
private String myServerPort;

Sehen:

Übrigens, die Elvis-Operator ist nur in Spring Expression Language (SpEL) verfügbar,
zB: https://stackoverflow.com/a/37706167/537554

Benutzer-Avatar
Robert Tupelo-Schneck

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html weist darauf hin, dass “lokale Eigenschaften”, die in der Bean selbst definiert sind, als Standardwerte betrachtet werden, die von aus Dateien gelesenen Werten überschrieben 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> 

Benutzer-Avatar
ikorennoy

Ich finde auch eine andere Lösung, die für mich funktioniert. In unserem alten Frühlingsprojekt verwenden wir diese Methode, um unseren Benutzern die Möglichkeit zu geben, diese eigenen Konfigurationen zu verwenden:

<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="false"/>
    <property name="locations">
        <list>
            <value>file:./conf/user.properties</value>
        </list>
    </property>
</bean>

Und in unserem Code für den Zugriff auf diese Eigenschaften müssen Sie so etwas schreiben:

@Value("#{appUserProperties.userProperty}")
private String userProperty

Und wenn eine Situation auftritt, in der Sie eine neue Eigenschaft hinzufügen müssen, diese aber im Moment nicht in der Produktionsbenutzerkonfiguration hinzufügen möchten, wird es sehr schnell zur Hölle, wenn Sie alle Ihre Testkontexte patchen müssen oder Ihre Anwendung fehlschlägt Anlaufen.

Um dieses Problem zu lösen, können Sie die nächste Syntax verwenden, um einen Standardwert hinzuzufügen:

@Value("#{appUserProperties.get('userProperty')?:'default value'}")
private String userProperty

Es war eine echte Entdeckung für mich.

1282160cookie-checkGibt es eine Möglichkeit, einen Standardeigenschaftswert in Spring XML anzugeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy