1

そのため、いくつかの記事では、contextInitializerClass 内で spring.profiles.active を構成する方法について説明しています。以下のようなものを web.xml に追加します。

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.mycompany.SpringProfileInitializer</param-value>
</context-param>

そして対応するクラス:

public class SpringProfileInitializer implements       ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {

        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        environment.setActiveProfiles( getActiveProfiles(NEED_PARAM_HERE) );            
    }

}

しかし、上記の getActiveProfiles() への呼び出しに引数を取得する必要があります。web.xml ファイルの「どこかに」ある限り、文字列だけで十分です。

これどうやってするの?

どうも。

編集:ステップをバックアップするために、私が実際に解決しようとしている問題は、1 つの JVM で実行されている複数の戦争の概念であり、それぞれが異なる spring.profiles.active プロパティを必要とし、さらに spring.profiles.active の値を必要としますいくつかのプロパティファイル内にあるenv固有になります。

明らかに、これは JVM に対してグローバルであるため、-Dspring.active.profilesは使用できません。env 固有の war ごとのプロパティ ファイルが既にあります。各 war は、 PropertyPlaceholderConfigurerを使用してこの prop ファイルを取り込む方法を知っています。この prop ファイルにspring.profiles.activeプロパティを追加しても機能しません (おそらく、処理が遅すぎます)。これらの戦争固有の小道具ファイルはすべて、戦争固有の名前で、ディスク上の既知の場所にインストールされることに注意してください。

これで、上記のようにApplicationContextInitializerを使用して 2 つの方法で問題を解決できます。

1)戦争ごとにApplicationContextInitializerを実装する新しいクラスを作成するだけで、実際の作業を行う「基本」クラスを拡張する可能性があります。class-per-war は、prop ファイルの名前をハードコーディングし、それを読み取り、spring.profiles.active プロパティを引き出すだけです。

2) 戦争全体で同じ名前の戦争固有の小道具ファイルを作成できます。これをspring-profile-loc.propertiesと呼びます。このファイルには、前述の war 固有の prop ファイルの名前であるプロパティが 1 つだけ含まれます。このシナリオでは、上記のSpringProfileInitializerクラスだけがあり、このspring-profile-loc.propertiesファイルを読み取り、単一のプロップを引き出し、実際のプロップ ファイルを読み取ってspring.profiles にアクセスします。アクティブな小道具 (このアイデアには他にもバリエーションがあります)。

私はどちらのアプローチも好きではありません。web.xml で何かを「構成」し、 ApplicationContextInitializerの実装で直接アクセスできれば、より簡単になります。

しかし、これを解決するためのまったく異なるアプローチがあれば、私はすべて耳にします。

どうも。

4

2 に答える 2

0

これにより、web.xml ファイルでプロファイルをアクティブ化できます。

Dispatcher Servlet の init-param で:

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>myenv</param-value>
    </init-param>
</servlet>

またはこれごと

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>profileName</param-value>
</context-param>
于 2012-09-11T18:44:47.393 に答える
0

ServletContextAware を実装してから、 servletContext.getInitParameter() (または getAttribute() ?) を使用できます。

しかし、この時点で注入された servletContext が機能するかどうかはわかりません

于 2012-09-11T05:20:15.357 に答える