• spring RestTemplate utf16解码乱码


    一、背景

          请求的时候content-type utf-8, 响应的时候utf-16,  反序列化乱码,拿到的文本如下

    笀∀琀漀欀攀渀∀㨀∀攀礀䨀栀戀䜀挀椀伀椀䨀䤀唀稀䤀㄀一椀䤀猀䤀渀刀㔀挀䌀䤀㘀䤀欀瀀堀嘀䌀䨀㤀⸀攀礀䨀䨀娀䌀䤀㘀䤀洀䨀氀夀圀娀欀伀圀䴀㔀䰀圀儀㐀一樀䄀琀一䐀栀洀一匀㄀椀䴀䐀儀㌀䰀圀夀稀娀樀刀樀夀稀挀㐀娀吀最 䴀匀䤀猀䤀洀嘀琀夀圀氀猀䤀樀漀椀挀䜀嘀瘀挀䜀砀氀儀䜀㔀瀀戀礀㔀樀戀㈀

    二、解决方案

    1) 让请求响应方提供utf-8编码的内容,响应方可能不支持;

    2)升级spring-web的版本到最新的5.x,发生问题的时候使用版本为4.x;

    3)  因为升级会带来很多兼容性问题,会扩大影响面带来很多回归测试,倾向于从现有的接口方式入手,采用框架支持的接口来直接反序列;

    2.1 问题接口

    1 ResponseEntity<String> responseEntity = getRestTemplate().exchange(uri, method, requestEntity, String.class);
    2  
    3 BizClass instance = gson.fromJson(resultBody, BizClass.class);

       由于反序列化为string,导致的乱码,实际内容编码传输可能是二进制;

    2.2 用框架接口

    ResponseEntity<BizClass>response = getRestTemplate().exchange(url, method, requestEntity, BizClass.class);
    
    BizClass instance = response.getBody();

      由此,采用框架接口方式解决了 utf-16的乱码问题。

    三、反序列化建议

    • 不自己提取JSON串内容,再用Gson反序列化,一方面带来额外的反序列化开销;
    • 采用框架现成的泛型接口来调用直接获取反序列化后的对象;
  • 相关阅读:
    如何创建不可变的Java类或对象
    Java动态代理
    Java序列化和克隆
    关于 Java高新技术的一些认识
    利用Servlet在客户端输出PDF文件
    学好Java语言的几大要点
    父进程结束子进程怎么办?
    wait/waitpid
    速记
    pip使用镜像的方法
  • 原文地址:https://www.cnblogs.com/sinsonglew/p/16074312.html
Copyright © 2020-2023  润新知