spring - 从 4.1.2 升级到 Spring 4.3.16 后特殊字符损坏
问题描述
我正在开发一个主要基于 Java 8、Spring 4.1.2、Spring Integration 4.1.0、Spring Security 3.1.2、myBatis 3.2.3 和 Tomcat 8.5 构建的项目。项目中公开了一个 REST GET 方法,该方法返回具有特殊字符的 JSON é
。
最近我一直在尝试将整个项目升级到 Spring 4.3.16、Spring Integration 4.3.15 和 Spring Security 4.2.4。在此迁移之后,特殊字符出现扭曲。Postman 对该服务的请求返回\ufffd
代替字符和标头Content-Type →application/json
。
在 Spring 升级之前,通过 Postman 对函数的 GET 请求用于返回正确的字符和标头
Content-Type →application/json;charset=UTF-8
相同的 JSON 打印在日志中,特殊字符显示为xE9
Notepad++ 和é
记事本。
我试过以下 -
从 2.4.1更新
jackson-databind
到 2.8.11.2 - 没有用设置
int-http:request-mapping consumes="application/json" produces="application/json;charset=UTF-8"
在int-http:inbound-gateway
- 没有工作setCharacterEncodingFilter
在UTF-8
Tomcat 中启用web.xml
- 不起作用
从 Spring 4.1.2 迁移到 4.3.16 时,是否需要更改任何内容以进行正确的字符编码?
谢谢!
解决方案
我可以通过参考http:inbound-gateway 响应上的 Content-Type 来解决这个问题,它有 charset=iso-8859-1 而不是 utf-8
我添加了一个内容类型为 UTF-8 的 header-enricher。
<int:header-enricher>
<int:header name="Content-Length" expression="payload.length()"/>
<int:header name="Content-Type" value="application/json;charset=UTF-8"/>
</int:header-enricher>
有趣的是,在 Spring 升级之前,这不是必需的。但是,它现在有效。
推荐阅读
- windows - 如何通过直接在设备上执行 DeviceIoControl() 来获取 USB 设备描述符?
- python-3.x - 如何在python 3中的两个变量中返回两个列表
- python - 无法使用 python3 运行 Rodeo IDE
- ios - Angular 2/4:手机号码自动检测在 Angular2/4 中不起作用
- vba - 通过分隔符将多列拆分为行
- amazon-web-services - 如何根据较早的响应在 Amazon Lex 中给出特定的意图响应?
- spring - Spring测试事务线程
- json - 如何解组不同数据类型的 JSON 数组?
- reactjs - 使用 3rd 端服务器反应 axios Cors 策略错误
- java - org.json.simple 和 org.json 的区别