LightAdmin - 使用app时区自定义解析DateTime

时间:2015-06-08 15:27:46

标签: spring-mvc spring-boot spring-data spring-restcontroller lightadmin

我在Spring Boot中使用LightAdmin 1.1.0.Snapshot。我使用Joda DateTime来表示带区域的时间。

我可以看到LightAdmin以UTC格式捕获日期时间,用于解析数据的默认反序列化上下文是LightAdmin中的UTC。从调试开始,我看到LightAdmin使用自己的ObjectMapper和MessageConverters使用LightAdminRestMvcConfiguration,所以它没有使用Spring Boot全局覆盖来自定义Jackson2ObjectMapperBuilder,如下所示。

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.timeZone(coreProperties.appTimeZone());
    return builder;
}

有关如何1)覆盖LightAdmin中Jackson的设置以使用默认应用程序时区进行解析的任何帮助或2)在LightAdmin外部处理Json序列化/转换器以不同方式解决此问题。任何帮助都会很棒。

谢谢, 亚历

1 个答案:

答案 0 :(得分:0)

我解决问题的一种方法是在使用下面加载上下文后重新配置LightAdmin bean。

@Component
public class AppContextListener implements ApplicationListener<ContextRefreshedEvent>{

    @Inject
    CoreProperties coreProperties;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {

        GenericWebApplicationContext appContext = getRootApplicationContext(event);
        WebApplicationContext lightAdminWebContext = getWebApplicationContext(appContext.getServletContext(), LightAdminWebApplicationInitializer.SERVLET_CONTEXT_ATTRIBUTE_NAME);
        lightAdminWebContext.getBeansOfType(ObjectMapper.class).values().stream()
                    .forEach(objectMapper -> objectMapper.setTimeZone(coreProperties.appTimeZone()));
    }

    private GenericWebApplicationContext getRootApplicationContext(ContextRefreshedEvent event) {
        return (GenericWebApplicationContext) (event.getApplicationContext().getParent() != null ? event.getApplicationContext().getParent() : event.getApplicationContext());
    }
}