13

クラス DefaultConfig にプロパティtest=defaultがあり、@PropertySource アノテーションを使用してそれらを使用できるようにしています。

@Configuration
@PropertySource("classpath:default.properties")
public class DefaultConfig {}

次に、OverrideConfig クラスの別のプロパティ ファイルにある をオーバーライドできるようにしたいtest=overrideので、@PropertySource を再度使用します。

@Configuration
@Import(DefaultConfig.class)
@PropertySource("classpath:override.properties")
public class OverrideConfig {}

動作することを証明するテストを構成します。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={OverrideConfig.class})
public class TestPropertyOverride {

    @Autowired
    private Environment env;

    @Test
    public void propertyIsOverridden() {
        assertEquals("override", env.getProperty("test"));
    }

}

もちろん、そうではありません。

org.junit.ComparisonFailure: expected:<[override]> but was:<[default]>

デバッグを最大化すると、何が起こっているかがわかります。

StandardEnvironment:107 - Adding [class path resource [default.properties]] PropertySource with lowest search precedence
StandardEnvironment:107 - Adding [class path resource [override.properties]] PropertySource with lowest search precedence

後ろ向きのようです。私は単純な間違いを犯したり、これを誤解したりしていますか、それとも @Import-ed 構成クラスの @PropertySource によって定義されたプロパティが @Import-ing クラスの @PropertySource で定義されたプロパティによってオーバーライドされることを期待しますか?

4

5 に答える 5

7

OPによって作成されたJIRAの問題のコメントとして書かれたHelder Sousaによる解決策は次のとおりです。

[T]Spring xml で利用可能な動作 (1 つの xml が別の xml をインポートする) は、ネストされた構成を使用して実現できます。

@Configuration
@PropertySource("classpath:default.properties")
public class DefaultConfig {}
@Configuration
@PropertySource("classpath:override.properties")
public class OverrideConfig {

    @Configuration
    @Import(DefaultConfig.class)
    static class InnerConfiguration {}

}

この設定により、プロパティは適切な順序で収集されます。

于 2015-08-28T20:54:00.263 に答える
2

今日のSpring 4では、これを使用できます:

@TestPropertySource(value="classpath:/config/test.properties")

これを使用して、junit テストのプロパティを使用し、最終的にオーバーライドすることができます。

@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(value="classpath:/config/test.properties")
于 2015-03-29T16:13:34.203 に答える
1

私は現在、Spring 3.1 で同様のケースに苦しんでいますが、@PropertySourceオプションのプロパティ ファイルをサポートしていないため、プロパティをオーバーライドする別のアプローチを使用しています。

@Configuration
@PropertySource("classpath:default.properties")
public class BaseConfig {

  @Inject
  private ApplicationContext context;

  @PostConstruct
  public void init() throws IOException {
    Resource runtimeProps = context.getResource("classpath:override.properties");
    if (runtimeProps.exists()) {
      MutablePropertySources sources = ((ConfigurableApplicationContext) context).getEnvironment().getPropertySources();
      sources.addFirst(new ResourcePropertySource(runtimeProps));
    }
  }
...

通常の Bean の依存関係によって決定される順序以外に、インスタンス化@Importの特定の順序はまったく発生しないようです。@Configurationこのような順序を強制する方法は、基本@Configurationインスタンス自体を依存関係として注入することです。試していただけますか:

@Configuration
@Import(DefaultConfig.class)
@PropertySource("classpath:override.properties")
public class OverrideConfig {

  @Inject
  private DefaultConfig defaultConfig;

  ...
}

これは役に立ちますか?ここでも新しいContextHierarchy注釈が役立つかもしれませんが、これまでのところ試していません。

于 2013-04-25T11:00:26.423 に答える
1

次のように、プロパティの読み込み順序を強制できます。

@Configuration
@PropertySource(value={"classpath:default.properties","classpath:override.properties"})
public class OverrideConfig {
...
}
于 2013-06-08T05:47:57.753 に答える
1

同様の問題があり、カスタム構成でデフォルト プロパティも宣言することに成功しました。

@Configuration
@Import(DefaultConfig.class)
@PropertySource({"classpath:default.properties", "classpath:override.properties"})
public class OverrideConfig {}
于 2014-03-21T10:48:58.120 に答える