4

私が取り組んでいるプロジェクトには、独自のSpring Beanを定義する古い依存関係がいくつかありますが、メインアプリケーションから初期化する必要があります。これらの Bean はすべて、Spring プロファイルを使用して構築されます。つまり、プロダクション コードの場合は「default」、テスト コードの場合は「test」です。@import を使用してコンテキストを明示的に接続する代わりに、Spring プロファイルの使用をやめたいと考えています。

アイデアは、これらの古い依存関係をすべてカプセル化して、他のコンポーネントがスプリング プロファイルを気にする必要がないようにすることです。したがって、テストの観点から、アプリケーション コンテキストのセットアップは次のように記述できます。

@ContextConfiguration(classes = {TestContext.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest { 
  //tests
}

TestContext はさらに 2 つのクラスに指示します。そのうちの 1 つは古い依存関係をカプセル化します。

@Configuration
@Import(value = {OldComponents.class, NewComponents.class})
public class TestContext {
  //common spring context
}

プロファイルに対する古いコンポーネントの必要性をカプセル化するために、OldComponents.class は次のようになります。

@Configuration
@Import(value = {OldContext1.class, OldContext2.class})
public class OldComponents {

  static {
    System.setProperty("spring.profiles.active", "test");
  }

}

ここでの問題は、静的ブロックが時間内に実行されないように見えることです。mvn clean install を実行すると、ApplicationContext をロードできなかったため、テストで IllegalStateException が発生します。静的ブロックが実行されることを確認しましたが、この時点で (プロファイルに依存する) OldContext1 と OldContext2 が既に読み込まれているように見えます。つまり、手遅れです。

イライラするのは、IntelliJ がこの方法でテストをうまく実行することです。ただし、Maven はそうではありません。カプセル化したままこ​​れらのプロファイルを強制する方法はありますか? 中間コンテキスト クラスを作成しようとしましたが、問題は解決しませんでした。

テスト クラスで注釈 @ActiveProfiles を使用すると、問題なく実行されますが、この種の目的は無効になります。当然、本番環境でも同じことを実現したいと考えています。これは、プロファイルの必要性をカプセル化できない場合、web.xml で構成する必要があることを意味します。

4

4 に答える 4

0

構成クラスが AbstractApplicationContext を継承している場合は、次を呼び出すことができます。

getEnvironment().setActiveProfiles("your_profile");

例えば:

public class TestContext extends AnnotationConfigWebApplicationContext {

      public TestContext () {
            getEnvironment().setActiveProfiles("test");
            refresh();
      }

}

それが役に立てば幸い。

于 2013-10-09T14:53:23.817 に答える
0

最初に環境が有効になることを確認する必要があります。これが私のやり方です:

@Component
public class ScheduledIni {

    @Autowired
    private Environment env;

    @PostConstruct
    public void inilizetion() {
        String mechineName = env.getProperty("MACHINE_NAME");
        if ("test".equals(mechineName) || "production".equals(mechineName) {
            System.setProperty("spring.profiles.default", "Scheduled");
            System.setProperty("spring.profiles.active", "Scheduled");
        }
    }
}

スケジューラで注釈Prodileを追加DependsOnして、それを機能させます。

@DependsOn("scheduledIni")
@Profile(value = { "Scheduled" })
@Component
于 2016-09-05T09:10:22.720 に答える