Spring REST API(使用Jackson)在java 1.8.0_65
服务器上通过jetty-distribution-9.3.0.v20150612
在EC2 Linux机器上运行。
大多数API调用都运行良好,但有时我的客户端(移动应用/卷曲)会收到错误的响应 - curl: (18) transfer closed with outstanding read data remaining
。它在本地和远程Jetty机器上重现,有无压缩和SSL。
我已经使用Wireshark捕获了通信,看起来在发送1414字节的块时,突然(在发送整个JSON内容之前),设置了FIN标志的较小块。
什么会导致块流过早结束?
更新
经过大量的分歧和征服后,我在响应对象中发现了一个表情符号,可能会导致问题。
但奇怪的是,更改该字符串中的任何数据,而不删除该字符将导致此操作。好像它不是角色本身,而是它在弦乐中的位置。
目前,响应对象通过spring-webmvc:4.1.7
自动序列化为JSON,当此对象被手动序列化并发送时,它可以正常工作。持有该表情符号的数据成员注释为@JsonRawValue
,其值已经序列化为JSON。
答案 0 :(得分:0)
表情符号字符未在JSON响应中转义。
由于包含此表情符号的数据成员不是由Spring MVC序列化程序处理的,因此它是作为JSON对象中的原始字符串发送的,它是使用不处理整个集合的方法手动转义的unicode characters。
用StringEscapeUtils.escapeJson(..)
库提供的Apache commons-lang3:3.3.2
替换手动转义方法解决了这个问题。