2010-12-11 7 views
11

PropertyPlaceholderConfigurerを使用してプロパティファイルからJDBC接続情報などのアプリケーション設定をロードしています。また、プロパティとしてデフォルトのロケールやタイムゾーンなどの他の設定をしたいと思います。Springコンフィグレーションでデフォルトのロケールとタイムゾーンを初期化する

しかし、私はLocale.setDefault()TimeZone.setDefault()を実行する最良の方法が不明です。私は彼らがスタートアップの早い段階で1回だけ走りたい。他のコードが実行される前に、いくつかのコードを最初に実行する適切な方法がSpringにありますか?助言がありますか?

私はコマンドラインでデフォルト値を指定することができますが、このアプリケーションは多くの場所にインストールされ、誰かが-Duser.timezone = UTCなどを指定するのを忘れてしまうのを避けたいと考えています。

答えて

5

私はServletContextListenerを使用しました。 contextInitialized(..)TimeZone.setDefault(..)で呼び出されます。

任意のコンストラクタでタイムゾーンを使用している場合や、@PostConstruct/afterPropertiesSet()の場合でも、考慮されません。

あなたがそれを必要とする場合は、ここで私は考えることができるより良いアプローチ「草案」は、私がcontextInitializedメソッドを呼び出す前に、他のBeanを含むデフォルトの豆のいくつかの春の負荷を見つけthis question

+0

おかげで、: javaアプリケーションは次のように見えます。しかし、私は1つのInitializingBeanを持っていて、その中にタイムゾーンが必要な場合があります。そうであれば、私の 'setDefault()'コードを '@ PostConstruct' /' afterPropertiesSet() 'に代入するのは意味がありますか?これらのInitializingBeanは、spring xmlファイルで定義された順序で実行されていますか? – Tauren

+0

beanの 'order'属性を試してみることができます。私がリンクしている答えを見てください。 – Bozho

10

を見てみましょう、そうあなたが気になることがあれば教えてください:

public class SystemPropertyDefaultsInitializer 
    implements WebApplicationInitializer{ 

    private static final Logger logger = Logger 
      .getLogger(SystemPropertyDefaultsInitializer.class); 

    @Override 
    public void onStartup(ServletContext servletContext) 
      throws ServletException { 
     logger.info("SystemPropertyWebApplicationInitializer onStartup called"); 

     // can be set runtime before Spring instantiates any beans 
     // TimeZone.setDefault(TimeZone.getTimeZone("GMT+00:00")); 
     TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 

     // cannot override encoding in Spring at runtime as some strings have already been read 
     // however, we can assert and ensure right values are loaded here 

     // verify system property is set 
     Assert.isTrue("UTF-8".equals(System.getProperty("file.encoding"))); 

     // and actually verify it is being used 
     Charset charset = Charset.defaultCharset(); 
     Assert.isTrue(charset.equals(Charset.forName("UTF-8"))); 

     // locale 
     // set and verify language 

    } 

} 
-5

スタンドアロンのスプリングブートアプリケーションはどうですか?働くかもしれない

@SpringBootApplication 
@EnableScheduling 
@EnableConfigurationProperties(TaskProperty.class) 
public class JobApplication { 

/* @Autowired 
    private TaskProperty taskProperty; 
*/ 
    public static void main(String[] args) { 
     SpringApplication.run(JobApplication.class, args); 
    } 
} 
+1

これは関連する回答ではありません。 – nixgadgets

関連する問題