Spring XMLでデフォルトのプロパティ値を指定する方法はありますか?


91

Spring構成でJavaプロパティを使用するためにPropertyPlaceholderConfigurerを使用しています(詳細はこちら

例えば:

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

プロパティを追加したいのですが、既存のインスタンスがすべてデフォルト値を使用できる分散システムがあります。オーバーライドするプロパティ値が定義されていない場合のSpring構成でデフォルト値を示すことにより、すべてのプロパティファイルの更新を回避する方法はありますか?

回答:


14

ここに記載されているPropertyOverrideConfigurerを探していますか

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

別のBeanファクトリポストプロセッサであるPropertyOverrideConfigurerはPropertyPlaceholderConfigurerに似ていますが、後者とは対照的に、元の定義にはBeanプロパティのデフォルト値を設定することも、まったく値を設定しないこともできます。オーバーライドするプロパティファイルに特定のBeanプロパティのエントリがない場合、デフォルトのコンテキスト定義が使用されます。


誰かが私に何を説明してくれ18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAますか?誰もが知っていると思いますし、私は愚かですが
念のため

276

Spring 3は${my.server.port:defaultValue}構文をサポートしています。


8
参考までに:SPR-4785
cubanacan 2013年

11
私にとっては、プロパティが定義されているかどうかに関係なく、常にデフォルト値でプロパティをオーバーライドします。
Ondrej Bozek 2013年

12
@OndrejBozek-(古い投稿にアクセスして申し訳ありません)同じ問題が発生する可能性があります。SpringFrameworkの問題[ jira.spring.io/browse/SPR-9989]を参照してください。複数のプレースホルダー構成が関係する場合、「:」表記で指定されたデフォルト値は、チェーン内の最初のプレースホルダー構成によってのみ解決されます。したがって、最初の構成プログラムにプロパティがない場合、チェーンの下の構成プログラムにプロパティがある場合でも、プロパティは常にデフォルト値に設定されます。[ stackoverflow.com/a/22452984/599609]を
トーン、

1
${my.server.port:-defaultValue}同じ結果になるようです。:-:」ではなく「」に注意してください。
キャプテンマン

2
<context:property-placeholder/>これを機能させるには、追加する必要があります。または、PropertyPlaceholderConfigurer
shuckc

32

あまり知られていない機能があり、これはさらに優れています。ハードコードされたデフォルト値の代わりに、構成可能なデフォルト値を使用できます。次に例を示します。

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>

後で簡単にオーバーライドできるようにしながらデフォルトを使用するには、config.propertiesで次のようにします。

timeout.myBean = ${timeout.default}

これは私のために働いた${timeout.myBean:${timeout.default}}。これにより、私のデフォルトも変数にすることができました。
NewestStackOverflowUser 2018


10

デフォルト値の:後には、プロパティキーの後にaを付けることができます。たとえば、

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

またはJavaコードで:

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

見る:

ところで、Elvisオペレーターは、Spring Expression Language(SpEL)内でのみ使用できます。
例:https : //stackoverflow.com/a/37706167/537554


8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.htmlは、Bean自体に定義された「ローカルプロパティ」は、ファイルから読み取られた値によってデフォルトでオーバーライドされると見なされることを指摘しています。

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

thx、春のjavadocでそのことについての言葉がありましたが、どうすればよいのか理解できませんでした。
ギヨーム

0

また、私のために働く別の解決策を見つけます。従来の春のプロジェクトでは、ユーザーがこの独自の構成を使用できるように、この方法を使用しています。

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

そして、このプロパティにアクセスするためのコードでは、次のように記述する必要があります。

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

そして、新しいプロパティを追加する必要があるが、現在は本番ユーザー設定に追加したくないという状況が発生した場合、すべてのテストコンテキストにパッチを適用する必要があると、アプリケーションはすぐに失敗します。起動。

この問題を処理するには、次の構文を使用してデフォルト値を追加できます。

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

それは私にとって本当の発見でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.