spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出

前几天遇到一个需求,因为要兼容旧项目的编码格式,需要spring-cloud的rest接口,输出gb2312编码,本以为是一个很容易的事情,比如下面这样:

    @RequestMapping(method = RequestMethod.POST, value = "syncPaymentList",
            consumes = {"application/json; charset=gb2312"},
            produces = {"application/json; charset=gb2312"})
    public GatewayDataResult<DcbOrderListResponse> syncPaymentList(SyncPaymentListRequest request) {
        ...return ...;
    }

发现只是把输出的response里Content-Type变成了application/json;charset=gb2312,内容本身并没有变化(即:浏览器设置成简体中文,显示乱码)

有一个很简单粗暴的办法,到是可以(参考下面的),但是对原来代码改变太大:

    @RequestMapping(method = RequestMethod.GET, value = "/test")
    public void gb2312Test(HttpServletResponse response) throws IOException {
        response.setContentType("application/json;charset=gb2312");
        PrintWriter out = response.getWriter();
        out.print("{\"errno\":12,\"errmsg\":\"登录超时\"}");
        return;
    }

另外网有一些办法,比如修改application.yml

spring:
  http:
    encoding:
      enabled: true
      charset: GB2312
      force: true  

相当于传统spring-mvc中下面这段配置

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>gb2312</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

发现也没用,然后看了下jackson2的源码,com.fasterxml.jackson.core.JsonEncoding这个类,默认就只支持UTF-8/16编码,要支持其它编码的话

得自己扩展JsonGenerator,写一堆代码,太复杂,参考:https://stackoverflow.com/questions/10004241/jackson-objectmapper-with-utf-8-encoding

最后想起了以前dubbo中用fastjson替换jackson时,解决过类似问题(参考 dubbox REST服务使用fastjson替换jackson) ,发现了一个很简单的办法,拿fastjson替换jackson2,只要注入下面这个bean就可以了:

 1     @Bean
 2     public HttpMessageConverters fastJsonHttpMessageConverters() {
 3         FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
 4         FastJsonConfig fastJsonConfig = new FastJsonConfig();
 5         fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
 6         fastJsonConfig.setCharset(Charset.forName("gb2312"));
 7 
 8         List<MediaType> fastMediaTypes = new ArrayList<>();
 9         fastMediaTypes.add(MediaType.APPLICATION_JSON);
10         fastConverter.setSupportedMediaTypes(fastMediaTypes);
11 
12         fastConverter.setFastJsonConfig(fastJsonConfig);
13         HttpMessageConverter<?> converter = fastConverter;
14         return new HttpMessageConverters(converter);
15     }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏爱撒谎的男孩

Springmvc解决中文乱码问题

52050
来自专栏思考的代码世界

Mac搭建yaf项目

16300
来自专栏Spring相关

第5章—构建Spring Web应用程序—SpringMVC详解

第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

17240
来自专栏运维

ELK日志分析系统搭建部署

  日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志...

15420
来自专栏流柯技术学院

Jenkins不同job之间传递参数

在A项目配置面板中Post-build Actions选项中选择Trigger parameterized build on other projects ...

13920
来自专栏一英里广度一英寸深度的学习

Sqoop安装

下载页面下有两个链接,使用sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz,包含hadoop支持。不要用sqoop-1.4.7.tar....

96540
来自专栏腾讯云数据库(TencentDB)

Spring MVC使用redis共享session

Spring Web MVC是基于Java的轻量级Web框架,使用了MVC架构模式的思想。Spring Web MVC核心架构为:

973250
来自专栏世界第一语言是java

微服务架构搭建:Consul+sleuth+zipkin+Feign/Ribbon+SpringConfig+Zuul+Hystrix Dash-Board-Turbine

1.1K50
来自专栏电光石火

Jackson与spring框架整合的坑

在JavaWEB项目中,使用SSM框架,在项目启动时出现如下错误:  Cannot find class [org.springframework.http.c...

37360
来自专栏IT 指南者专栏

SpringMVC 框架系列之组件概述与配置详解

微信公众号:compassblog 欢迎关注,互相学习,共同进步! 有任何问题,请后台留言联系! 在上一篇文章 SpringMVC 框架系列之初识与入门实例 的...

31370

扫码关注云+社区

领取腾讯云代金券