3

次の Spring XML ベースの構成があります。

<!--
  These properties define the db.type property.
-->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  <property name="order" value="1"/>
  <property name="ignoreUnresolvablePlaceholders" value="true" />
  <property name="ignoreResourceNotFound" value="true" />
  <property name="locations">
    <list>
      <!-- contains default db.type -->
      <value>classpath:/default-cfg.properties</value>
      <!-- db.type can be overridden by optional properties in the app work dir -->
      <value>file:${app.work.dir}/cfg.properties</value>
    </list>
  </property>
</bean>

<!-- db.type should be used to get DB specific config properties -->
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  <property name="order" value="2"/>
  <property name="ignoreUnresolvablePlaceholders" value="false" />
  <property name="ignoreResourceNotFound" value="false" />
  <property name="locations">
    <list>
      <!-- does not work, ${db.type} does not get resolved -->
      <value>classpath:/default-cfg-${db.type}.properties</value>
    </list>
  </property>
</bean>

問題は、最初のプロパティ プレースホルダー コンフィギュアラーによって定義されているにclasspath:/default-cfg-${db.type}.propertiesもかかわらず、その場所のプロパティが解決されないことです。db.type

ログに次のエラーが表示され続けます。

 class path resource [default-cfg-${db.type}.properties] cannot be opened because it does not exist

PropertyPlaceholderConfigurer の locations 属性でプロパティを使用する方法はありますか? JVM システム プロパティを使用して db.type 値を設定することは避けたいと考えています。

ありがとう、ジャン

4

2 に答える 2

2

Alireza Fattahi が私のコードを要求し、WornOutSoles が受け入れられた解決策が機能しないことを示唆したため、Spring ApplicationContextInitializer に基づく最終的な解決策を投稿します。

public class SpringProfilesActivator
    implements ApplicationContextInitializer<XmlWebApplicationContext>
{
  private static final Logger log = LoggerFactory.getLogger( SpringProfilesActivator.class );

  ...

  @Override
  public void initialize( XmlWebApplicationContext applicationContext )
  {
    // TODO: get your profiles from somewhere (config files, JVM system properties, database etc.)
    String[] activeProfiles = new String[] { ... };

    log.info( "Activating Spring profiles: {}", Arrays.toString( activeProfiles ) );

    ConfigurableEnvironment env = applicationContext.getEnvironment();
    env.setActiveProfiles( activeProfiles );
  }

  ...
}
于 2014-12-30T14:22:21.603 に答える