Инициализация локали и часового пояса по умолчанию с конфигурацией Spring - PullRequest
13 голосов
/ 11 декабря 2010

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

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

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

Ответы [ 3 ]

11 голосов
/ 30 октября 2014

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

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

    }

}
6 голосов
/ 11 декабря 2010

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

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

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

0 голосов
/ 24 января 2017

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

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

/*  @Autowired
    private TaskProperty taskProperty;
*/  
    public static void main(String[] args) {
        SpringApplication.run(JobApplication.class, args);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...