Инициализировать стандартную локаль и часовой пояс по умолчанию с конфигурацией 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);
}
}