Mule ESB Http项目转换为Tomcat项目(6) 中文乱码问题处理

喜欢而已 提交于 2019-11-29 11:16:30

在前面转换的Tomcat项目中,我们发起的json请求内容是英文的,tomcat项目正常处理请求,返回xml报文。但是如果我们的请求json报文中包含了中文,例如

{
   "name":"王三",
   "id":"197"
}

这样的请求发送给ESB项目时中文处理正常,没有出现乱码。

<?xml version='1.0' encoding='UTF-8' ?>
<Student>
<name>王三</name>
<id>197</id>
 </Student>

这是因为ESB项目中的Http Listener控件已经内置了将请求的json报文按UTF-8编码格式读取,使得处理请求时不会出现中文乱码。

ESB项目转换成的Tomcat项目使用Servlet inbound endpoint替换了Http Listener控件,处理json报文时缺乏了内置编码支持,响应的xml报文因而出现了乱码。

<?xml version='1.0' encoding='utf-8'?>
<Student>
  <name>王三</name>
  <id>197</id>
</Student>

为了处理中文乱码,我们需要在转换后的Tomcat项目的流程文件testproject.xml的servlet inbound endpoint后添加以下代码:

 <set-property propertyName="MULE_ENCODING" value="UTF-8" doc:name="Property" />
 <byte-array-to-string-transformer doc:name="Byte Array to String"/>

这两句代码第一句是设置ESB流程使用的Encoding为UTF-8,第二句代码表示当流程将请求Body Stream读取为String字符串(使用第一句设置的UTF-8编码)。

修改流程文件后再重启tomcat,调用tomcat项目,可以保证送到Tomcat项目中的请求报文不会出现乱码,但是在响应报文输出时在有的客户端仍然会有乱码。

如果我们使用Soap UI调用Tomcat项目接口,得到的响应是这样的:

但是当我们使用httpclient 4.x调用这个接口时,返回的Response中没有中文乱码

<?xml version='1.0' encoding='UTF-8'?>
<Student>
  <name>张三</name>
  <id>197</id>
</Student>

同样的请求,在不同客户端的返回出现不一致,这是因为Java程序处理响应报文时,仅仅是按照报文体文本本身内容输出,而Soap UI,Advanced Rest Client在处理响应报文时,则要根据报文头部信息显示响应报文体,在我们这个项目中,响应的报文体格式是application/xml,但是因为响应报文头部没有设定Content Type, soap ui仍根据请求时的Content Type application/json去处理响应报文体,因此无法正确获取响应报文的正确编码格式UTF-8,仍然按照ISO-8859-1格式进行转码处理,从而中文显示为乱码。

要解决不同客户端调用结果显示的不一致,我们需要在Tomcat的流程文件中,设置响应报文的Content-Type:

<response>
    <message-properties-transformer>
        <add-message-property key="Content-Type" value="application/xml;charset=utf-8" />
    </message-properties-transformer>
</response>

如果在流程的返回节点前用户自定义了用于处理Response的自定义Transformer,也可以在Transformer类的transformMessage方法中添加如下代码:

message.setOutboundProperty("Content-Type", "application/xml;charset=utf-8");

这里的message是响应对应的MuleMessage对象。

用这两种方法之一对流程文件做了修改后,再调用Tomcat项目接口,可以看到返回的报文内容中文不再出现乱码:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!