2010-12-11 17 views
11

Estoy cargando la configuración de la aplicación como información de conexión JDBC desde un archivo de propiedades utilizando PropertyPlaceholderConfigurer. También me gustaría tener otras configuraciones, como configuración regional predeterminada y zona horaria como propiedades.Inicializar configuración regional predeterminada y zona horaria con la configuración de Spring

Pero no estoy seguro del mejor método para ejecutar Locale.setDefault() y TimeZone.setDefault(). Quiero que se ejecuten temprano en el inicio y solo una vez. ¿Hay alguna forma adecuada en Spring de ejecutar primero algún código, antes de que se ejecute otro código? ¿Alguna sugerencia?

Sé que puedo especificar valores predeterminados en la línea de comandos, pero esta aplicación se instalará en muchos lugares y quiero evitar problemas causados ​​por alguien que se olvidó de especificar -Duser.timezone = UTC o lo que sea.

Respuesta

5

He usado un ServletContextListener. En contextInitialized(..) se llama TimeZone.setDefault(..).

No se tendrá en cuenta si se basa en la zona horaria en cualquier constructor o en @PostConstruct/afterPropertiesSet().

Si lo necesita, echar un vistazo a this question

+0

Gracias, eso podría funcionar. Sin embargo, tengo un InitializingBean y podría necesitar la zona horaria en él. Si ese es el caso, ¿tiene sentido poner mi código 'setDefault()' en un '@ PostConstruct' /' afterPropertiesSet() 'en su lugar? ¿Estos InitializingBeans se ejecutan en el orden definido en el archivo xml de primavera? – Tauren

+0

Puede intentar usar el atributo 'order' de beans. o ver la respuesta que ligé – Bozho

10

me encontré con un montón de primavera algunas de sus granos por defecto incluyendo otros granos antes de llamar al método contextInitialized, así, aquí es un mejor enfoque de "proyecto" que se me ocurre de, hágamelo saber si usted ve cualquier preocupación:

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

¿Qué hay de aplicación de arranque autónomo de primavera? La aplicación Java se ve así:

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

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

Esta no es una respuesta relevante. – nixgadgets

Cuestiones relacionadas