使用 Spring 配置初始化默认区域设置和时区

2022-09-04 03:26:56

我正在使用 从属性文件加载应用程序设置,例如 JDBC 连接信息。我还希望将其他设置(例如默认区域设置和时区)作为属性。PropertyPlaceholderConfigurer

但我不确定执行和的最佳方法。我希望它们在启动早期运行,并且只运行一次。在 Spring 中,有没有一种适当的方法可以在执行其他代码之前先执行一些代码?有什么建议吗?Locale.setDefault()TimeZone.setDefault()

我知道我可以在命令行上指定默认值,但是此应用程序将安装在许多地方,并且我想避免由于忘记指定或其他原因而导致的问题。-Duser.timezone=UTC


答案 1

我发现Spring在调用上下文初始化方法之前加载了一些默认的bean,包括其他bean,所以,这是一个更好的方法“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

    }

}

答案 2

我用了.In 被调用。ServletContextListenercontextInitialized(..)TimeZone.setDefault(..)

如果您依赖任何构造函数或/中的时区,则不会将其考虑在内。@PostConstructafterPropertiesSet()

如果你需要它,看看这个问题


推荐