1

コードにアクセスできない外部ライブラリを使用するSpring MVCがあります。この外部ライブラリは、標準の system.getProperty 呼び出しを使用していくつかのプロパティを読み取ります。サービスを使用する前に、これらの値を設定する必要があります。

私のアプリケーションは Spring MVC アプリケーションであるため、これらのプロパティを初期化する方法がわかりません。これが私がこれまで行ってきたことですが、何らかの理由で値が常にnullです。

プロパティをプロパティファイルに入れます/conf/config.properties

my.user=myuser
my.password=mypassowrd
my.connection=(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx.xxxx.xxxx)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myService)))

次に、次の2行を追加しましたapplicationContext.xml

<context:annotation-config/>
<context:property-placeholder location="classpath*:conf/config.properties"/>    

初期化コードをセットアップするには、InitializingBean インターフェイスを実装できるというドキュメントを読んだので、インターフェイスを実装し、afterPropertiesSet() メソッドを実装しました。

private static @Value("${my.user}") String username;
private static @Value("${my.password}") String password;
private static @Value("${my.connection}") String connectionString;  

@Override
    public void afterPropertiesSet() throws Exception {     
        System.setProperty("username",username);
        System.setProperty("password",password);
        System.setProperty("connectionString",connectionString);
    } 

afterPropertiesSet()問題は、メソッドが呼び出されたときに値が常に null になることです。

  • 上記のアプローチは、特にコントローラーのコードを初期化する正しい方法ですか? コントローラーに対して 2 回目の呼び出しが行われるとどうなりますか?
  • 初期化のため、値は null ですか? つまり、春はまだそれらを設定していませんか?
  • コントローラーから離れた場所に初期化コードを追加することは可能ですか?
4

2 に答える 2

2

Bean/コントローラーの定義が、定義がある場所と同じSpringコンテキスト構成ファイルにあることを確認していproperty-placeholderますか?

この質問に対する Boris の回答をご覧ください: @Controller クラスの Spring @Value アノテーションがプロパティ ファイル内の値に評価されない

コントローラーからコードを移動したい場合は、Spring の初期化が終了したときにリッスンするコンポーネントを追加し、hen がコードを呼び出すことができます。

@Component
public class ApplicationStartedListener implements ApplicationListener<ContextRefreshedEvent> {

    private static @Value("${my.user}") String username;
    private static @Value("${my.password}") String password;
    private static @Value("${my.connection}") String connectionString;

    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.setProperty("username",username);
        System.setProperty("password",password);
        System.setProperty("connectionString",connectionString);
    } 
}
于 2013-01-01T16:34:30.690 に答える
1

修正はかなり簡単なはずですstatic。フィールドから修飾子を削除するだけで、とAutoWiredAnnotationPostProcessorで注釈が付けられたフィールドに挿入する役割を果たし、値を正しく挿入できるようになり、きれいに呼び出されるはずです。@AuotWired@ValueafterPropertiesSet

于 2013-01-01T21:47:47.540 に答える