在前面转换的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项目接口,可以看到返回的报文内容中文不再出现乱码:
来源:oschina
链接:https://my.oschina.net/u/237688/blog/698920