zoukankan      html  css  js  c++  java
  • spring boot2 配置 FastJsonHttpMessageConverter 不起作用

    项目使用自定义 FastJsonHttpMessageConverter 进行API数据响应JSON转换器

    在原来springboot1.X 版本中是可以生效,配置如下:

    /**
         * 替换使用 FastJson 解析返回结果
         */
        @Override  
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {  
            /**
             * 1.先定义一个convert转换消息的对象
             * 2.添加fastjson的配置信息,比如:是否要格式化返回的json数据
             * 3.在convert中添加配置信息
             * 4.将convert添加到converters当中
             */
            //1.先定义一个convert转换消息的对象
            FastJsonJsonpHttpMessageConverter fastConverter = new FastJsonJsonpHttpMessageConverter();
            //2.添加fastjson的配置信息,比如:是否要格式化返回的json数据
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
            
            //处理中文乱码问题(不然出现中文乱码)
            List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
            fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
            fastConverter.setSupportedMediaTypes(fastMediaTypes);
            
            //3.在convert中添加配置信息
            fastConverter.setFastJsonConfig(fastJsonConfig);
            //4.将convert添加到converters当中
            converters.add(fastConverter);
        } 

    升级为springboot2后,响应 FastJsonHttpMessageConverter 未起作用,按对springmvc的了解 ,如果自定义不生效的话,应该是使用默认消息转换器。为验证想法,在配置中添加如下代码打印出消息转换器列表:

    @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            for (HttpMessageConverter<?> messageConverter : converters) {
                System.out.println(messageConverter); //2
            }
        }

    输出如下信息:

    org.springframework.http.converter.ByteArrayHttpMessageConverter@433e3357
    org.springframework.http.converter.StringHttpMessageConverter@4a1066a2
    org.springframework.http.converter.StringHttpMessageConverter@37531849
    org.springframework.http.converter.ResourceHttpMessageConverter@1cc4de0
    org.springframework.http.converter.ResourceRegionHttpMessageConverter@54629d11
    org.springframework.http.converter.xml.SourceHttpMessageConverter@66f4a841
    org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@49ca7586
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@61a93e7c
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2a0a9212
    com.dreamer.core.converter.FastJsonJsonpHttpMessageConverter@6a400857

    可以看出自定义的消息转换器【FastJsonJsonpHttpMessageConverter】在列表最后。

    根据消息转换器的应用规则,会顺序选择符合要求的消费转换器,MappingJackson2HttpMessageConverter 在 FastJsonJsonpHttpMessageConverter 前面,这样就会使用 MappingJackson2HttpMessageConverter  进行消费转换,为了确认想法正确,我在 MappingJackson2HttpMessageConverter  -> writeInternal 方法进行了debug,运行后,确实与想法一致。

    找到原因,那就只要把 自定义的消息转换器【FastJsonJsonpHttpMessageConverter】添加到 MappingJackson2HttpMessageConverter 前面就可以,而对于自定义的消息转换器配置还有另一种方式,如下

    @Bean
        public HttpMessageConverters fastJsonHttpMessageConverters() {
            /**
             * 1.先定义一个convert转换消息的对象
             * 2.添加fastjson的配置信息,比如:是否要格式化返回的json数据
             * 3.在convert中添加配置信息
             * 4.将convert添加到converters当中
             */
            //1.先定义一个convert转换消息的对象
            FastJsonJsonpHttpMessageConverter fastConverter = new FastJsonJsonpHttpMessageConverter();
            //2.添加fastjson的配置信息,比如:是否要格式化返回的json数据
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
            
            //处理中文乱码问题(不然出现中文乱码)
            List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
            fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
            fastConverter.setSupportedMediaTypes(fastMediaTypes);
            
            //3.在convert中添加配置信息
            fastConverter.setFastJsonConfig(fastJsonConfig);
            
            return new HttpMessageConverters(fastConverter);
        }

    配置后,重启项目,看到项目中消息转换器列表打印如下内容:

    com.dreamer.core.converter.FastJsonJsonpHttpMessageConverter@75652058
    org.springframework.http.converter.ByteArrayHttpMessageConverter@30fa29ef
    org.springframework.http.converter.StringHttpMessageConverter@7749f8a4
    org.springframework.http.converter.ResourceHttpMessageConverter@5351785e
    org.springframework.http.converter.ResourceRegionHttpMessageConverter@f6af58c
    org.springframework.http.converter.xml.SourceHttpMessageConverter@6ebe10df
    org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter@560a4974
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@e415863

    这里就可以看出 自定义的消息转换器【FastJsonJsonpHttpMessageConverter】在 MappingJackson2HttpMessageConverter 前面 ,同时运行API,debug 是运行 FastJsonJsonpHttpMessageConverter  -> writeInternal 方法 。

    本文转载自:https://my.oschina.net/u/875122/blog/1928528

  • 相关阅读:
    cv2 Qt Platform plugin "cocoa" not found error
    开发scrapy web界面(一)
    java2smali python 粘合脚本
    react如何设置代理
    Nginx启动不了失败原因
    前端,后端,服务器如何部署,转载
    匿名函数普通函数和构造函数
    闭包的认识
    各种命名规范,打好基础才能建设高楼
    mongoose常用操作
  • 原文地址:https://www.cnblogs.com/damoblog/p/13589200.html
Copyright © 2011-2022 走看看