zoukankan      html  css  js  c++  java
  • Springboot Jackson配置根本方案, 日期格式化, 时区设置生效

    当项目集成配置的功能越来越多, 说不准哪个配置就影响到了什么.

    比如你启用了EnableMvC, 默认配置文件配置的一些文件就失效了. 虽然约定大于配置,让springboot可以极简化构建, 但不熟悉内部各个组件执行原理会导致我们经常出一些莫名其妙的问题, 比如配置不生效,比如Jackson的日期格式化.

    debug了很久, 配置文件不生效, 直接声明ObjectMapper也不管用. 原因就在于Springboot所谓的简化是通过一系列的条件配置产生, 比如WebMvcConfigurationSupport, 里面到处都是if-else配置逻辑.
    这些配置开关复杂且并不知道散落在哪里.

    既然如此, 我直接手动配置好了. 关于springboot json序列化的关键是MappingJackson2HttpMessageConverter, 我们需要把springboot默认给配置的converter干掉, 然后放上自己的.

    @Configuration
    public class RequestHandlerConfig extends WebMvcConfigurationSupport {
    
        private Logger logger = LoggerFactory.getLogger(RequestHandlerConfig.class);
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //请求上下文初始化拦截器配置
            logger.info("初始化拦截器完成.....");
        }
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        }
    
        @Bean
        public ObjectMapper jacksonObjectMapperCustomization() {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
            format.setTimeZone(timeZone);
    
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                    .timeZone(timeZone)
                    .dateFormat(format);
    
            return builder.build();
        }
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);
            converters.add(new MappingJackson2HttpMessageConverter(jacksonObjectMapperCustomization()));
        }
    
    }
    
  • 相关阅读:
    iOS 获取内外网ip
    iOS 查看层级关系以及调用堆栈
    CoreML Use of undeclared type & Use of unresolved identifier
    AFN的实时网络监控 但是block连续调用了两次
    iOS 11 偏好设置(NSUserDefaults)无效了?
    iOS 11 UIScrollView的新特性(automaticallyAdjustsScrollViewInsets 不起作用了)
    Xcode9~iOS11初体验 无线调试
    Hook~iOS用钩子实现代码注入(埋点方案)
    tomcat启动时端口占用的问题怎么解决
    Memcached在Linux环境下的使用详解http://blog.51cto.com/soysauce93/1737161
  • 原文地址:https://www.cnblogs.com/woshimrf/p/12175861.html
Copyright © 2011-2022 走看看