文档章节

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

杨延庆
 杨延庆
发布于 2016/06/22 09:57
字数 835
阅读 403
收藏 4

在前面转换的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项目接口,可以看到返回的报文内容中文不再出现乱码:

© 著作权归作者所有

杨延庆

杨延庆

粉丝 35
博文 48
码字总数 44823
作品 0
浦东
架构师
私信 提问
将Mule ESB Http项目转换为Tomcat项目(4) 将ESB项目改造为Web项目

系列2中创建的ESB项目无法在Studio中直接转换为可以部署到Tomcat的Web项目,因为Mule Anypoint Studio提供的Project Facet不包含Dynamic Web Module,只有Static Web Module,需要我们进行手动...

杨延庆
2016/06/21
525
16
Mule ESB Http项目转换为Tomcat项目(9) 日志问题处理

Mule ESB项目的日志输出有两种方式,可以在流程中添加Logger组件输出日志,也可以在自定义的代码中添加日志输出。Mule ESB日志使用Log4j2库进行输出,Mule ESB 企业版使用的log4j2版本是2.1...

杨延庆
2016/06/28
538
1
Mule ESB Http项目转换为Tomcat项目(7) 与Spring的结合

由于Mule ESB提供的容器自身限制,使它不容易集成第三方库。为了解决这个问题,Mule提供了ESB项目与Spring框架的集成。但是这个集成在转换为Tomcat项目时会遇到一些问题,下面我会一一加以叙...

杨延庆
2016/06/23
758
0
将Mule ESB Http项目转换为Tomcat项目(3) ESB项目运行

建立好了Mule ESB Http项目,即可以开始运行,但是因为Studio maven编译存在的问题,如果直接以[Mule Application With Maven]方式运行ESB项目的话,会先将ESB项目使用maven编译成zip再部署到...

杨延庆
2016/06/20
554
0
将Mule ESB Http项目转换为Tomcat项目(5) 改造Tomcat

需要运行ESB项目转换的web项目的Tomcat最低版本要求是7.0.50,我们使用了7.0.69。Tomcat需要做以下改动: 1)修改conf/server.xml文件,添加以下代码: 2)在tomcat根目录下新建名为mulelibs的目...

杨延庆
2016/06/21
293
0

没有更多内容

加载失败,请刷新页面

加载更多

视频如何加水印?

很多视频制作者的视频都被他人盗用过,为了防止自己的劳动成果被他人窃取,给视频加水印对于视频制作者来说,是一件非常重要的事情。那么下面分享一个手机给视频加水印的方法,一起来看看吧!...

白米稀饭2019
30分钟前
5
0
004-Envelop-基于Blockstack的文件传输dapp

本篇文章主要介绍基于Blockstack的文件传输工具; ####A-链接地址 官网地址:https://envelop.app/ Github地址:https://github.com/envelop-app ####B-特性: 1: Share private files easil...

Riverzhou
32分钟前
7
0
SpringCloud——声明式调用Feign

Feign声明式调用 一、Feign简介 使用Ribbon和RestTemplate消费服务的时候,有一个最麻烦的点在于,每次都要拼接URL,组织参数,所以有了Feign声明式调用,Feign的首要目标是将Java HTTP客户端...

devils_os
38分钟前
7
0
《JAVA核心知识》学习笔记 (22. 数据结构)

22.1.1. 栈(stack) 栈( stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶 (top)。它是后进先出(LIFO)的。对栈的基本操作只有 push(进栈)和 pop(出栈...

Shingfi
44分钟前
6
0
你对AJAX认知有多少(1)?

AJAX(一) AJAX技术对于前段或者后端工程师来说,都是必不可缺的 那我们这几期都来细细品味一下AJAX的相关知识,直接上干货喽~ 1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么...

理性思考
51分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部