0

我正在使用带有 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 序列化/转换器以不同方式解决此问题的任何帮助。任何帮助都是极好的。

谢谢,亚历克斯

4

1 回答 1

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());
    }
}
于 2015-06-14T11:28:48.230 回答