Инициализировать стандартную локаль и часовой пояс по умолчанию с конфигурацией Spring

Я загружаю настройки приложения, такие как информация о соединении JDBC, из файла свойств, используя PropertyPlaceholderConfigurer. Я хотел бы также иметь другие настройки, такие как стандартная локаль и часовой пояс в качестве свойств.

Но я не уверен в наилучшем методе выполнения Locale.setDefault() и TimeZone.setDefault(). Я хочу, чтобы они запускались в начале стартапа и только один раз. Правильно ли в Spring выполнить код FIRST, прежде чем будет выполнен другой код? Любые предложения?

Я знаю, что могу указать значения по умолчанию в командной строке, но это приложение будет установлено во многих местах, и я хочу избежать проблем, вызванных тем, что кто-то забыл указать -Duser.timezone = UTC или что-то еще.

Ответ 1

Я использовал ServletContextListener. В contextInitialized(..) TimeZone.setDefault(..) вызывается.

Он не будет учитываться, если вы полагаетесь на часовой пояс в любом конструкторе или @PostConstruct/afterPropertiesSet(), хотя.

Если вам это нужно, посмотрите этот вопрос

Ответ 2

Я обнаружил, что Spring загружает некоторые из своих стандартных beans, включая другие beans, перед вызовом метода contextInitialized, так что вот лучший подход "draft", о котором я могу думать, сообщите мне, видите ли вы относятся:

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

    }

}

Ответ 3

Как насчет автономного spring загрузочного приложения? Приложение java выглядит так:

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

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