在发布Web服务
的时候,WSDL
作为服务的描述,里面有一个标签可以写入中文
,是用来作为注解来写入描述性信息的,这个标签就是<wsdl:documentation>
。OECP平台中使用开源ESB总线mule
来做webService
发布使用.发布时就遇到了中文
描述乱码
问题,经过一天多的时间来翻阅mule和cxf的源代码,问题最终被解决。这里记录一下解决的过程和方法。
mule
内使用的spring-cxf来将一个java方法转换为webService
。cxf有一个annotation是生成wsdl
中的<wsdl:documentation>
标签用的,这个annotation就是@WSDLDocumentation
。但是这个标签使用后,生成的WSDL
文件,中文
却显示成了乱码
。
经过测试发现,单纯使用Spring-cxf时,@WSDLDocumentation
不会产生乱码
。这就说明问题出在mule
上。只能翻一下mule
的
源代码来查找原因了。由于找不到与当前使用的jar包版本相同的源代码,只能使用升级版的源码,调试的时候发现升级的改动比较大,删掉的以前的一些方法和
代码修改也蛮多,错行缺行导致调试可读性极差,让我一直看了一天多。比较安慰的是最终还是找到了问题原因并解决了。下面就具体说一下原理。
我们知道发布WebService
以后,使用url+?wsdl的方式访问,将会获取到服务描述文件wsdl
文件.mule
中发布服务后,使用这种方式访问服务器将会启动一个线程,线程调用链如下图:
标记①下面,是http请求引起的mule
事件级联链条,是mule
内部的架构机制,这个不是我们现在要所关注的.重点在第②行,红色标记出的OutputStream就是用来承载wsdl
文件流的对象,实际上它是一个ByteArrayOutputStream。在图上⑥的位置执行完后,这个Stream将被写入完成。前面的每一个步骤中文字符
的编码都是正确的,即便是写入到Stream中,字符的byte编码也没有问题。但是,此时我们发现查看这个Stream的内容时,却看到了乱码
。这是为什么呢?为什么Stream中存储的byte没错,但是却能看到乱码呢?
经常调试程序的朋友们知道,当我们查看一个对象的内容时,对象查看器,将调用对象的toString方法。经检查发现ByteArrayOutputStream的toString方法果然被重写:
java 代码
-
public
synchronized
String toString() {
-
return
new
String(buf,
0
, count);
-
}
ByteArrayOutputStream使用buffer中所有的byte创建并返回了一个String对象。这里注意,创建String的时候并没
有指定编码格式。那么它用的是什么编码格式?我们去String中看看,String使用了StringCoding来转化byte为char数组,而其
中选用的编码格式是从Charset.defaultCharset()得来的。从JDK的API中我们能找到了这个方法,上面是这么说的:
在我们的服务器运行环境中得到的默认编码
格式为GBK。于是乱码形成的原因找到了:由于Spring-cxf生成服务的wsdl
时用的是UTF-8编码,而被mule
错误的使用了服务器运行环境默认编码GBK,所以UTF-8下的正常显示中文
最终被显示为乱码
了。
mule
中的类CxfInboundMessageProcessor第201行:
msg = out.toString();
这就是乱码
产生的根源,在将字节流转为字符串的时候,没有指定编码格式,而默认使用了GBK,就是wsdl
文件乱码
的原因。
解决这个问题又两种方案:
1. 改变jvm的默认字符编码。
2. 修改CxfInboundMessageProcessor类的源代码。
第一种方案通过修改服务器的启动参数,追加一段“-Dfile.encoding=UTF-8”,就可以改变服务器的java运行环境。此时启动服务器时我们会发现,虽然我们的WSDL中文不再出现乱码了,但是服务器控制台显示的中文
却全都成了乱码
。我猜是服务器的日志输出依赖于操作系统的默认字符集吧。暂且不说这个日志乱码
问题,即使不存在这个问题我认为这种方案也是不太合适的。wsdl
是否出现乱码依赖于运行服务器的默认字符集,对于OECP平台来说是不可控的。OECP平台使用什么样的字符编码应该依赖于应用自己的配置。
于是决定修改mule
的源代码,比较幸运的是CxfInboundMessageProcessor这个类,在升级的过程中没有改动,不然就要反编译来获取源码了。
将201行的msg = out.toString();修改为如下代码:
java 代码
-
String enc = event.getMuleContext().getConfiguration().getDefaultEncoding();
-
msg = out.toString(enc);
从mule
的配置中得到配置的编码格式,并在将Stream转换为String的时候指定使用此编码格式.至此问题解决了.
我们可以在使用mule发布服务时,使用WSDLDocumentation
标签来为服务添加描述了.wsdl
作为WebService
的描述,如果没有注释性的文字,wsdl
描述可读性实在不是很好. WSDLDocumentation
标签就是作为这种描述存在的,如果你想在WSDL
中加入中文
的描述这个标签应该是唯一的选择.如果你使用的也是mule
,也遇到了中文
的乱码
问题,希望可上面的内容可以帮助你。
作者本人将原文转发到此,原文地址为:http://www.oecp.cn/hi/slx/blog/2315
分享到:
相关推荐
Mule ESB Studio 3.3 中文使用手册(官方翻译) Mule ESB Studio 3.3 是一款功能强大且灵活的集成平台,旨在帮助开发者快速构建、部署和管理企业级集成解决方案。该手册旨在指导用户如何安装、配置和使用 Mule ESB ...
该部分介绍了Mule Studio的基本使用方法,包括如何下载安装、创建项目、保存项目、运行和停止项目等。 3. Mule Studio基本概念和组件 文档详细介绍了Mule Studio的各个部件,包括端点(Endpoints)、组件...
Mule ESB支持实时监控和日志记录,帮助管理员跟踪应用性能,发现并解决问题。Mule Management Console和Mule Management API提供了一套全面的工具来管理和监控Mule部署。 **7. Mule运行时与Mule Cloud Connectors**...
Mule ESB 是一个轻量级的基于java的企业服务总线和集成平台, 使得开发人员可以快速,简单的连接多个... Mule ESB 包含如下强大的能力: 服务创建和托管— 暴露和托管可重用服务, 使用Mule ESB作为一个轻量级服务容器.
- 对于"hello-ws",我们需要一个处理"sayHello"请求的方法,该方法接受请求参数,生成响应并返回。 3. **发布SOAP服务**: - 在Mule应用中配置SOAP监听器,使其监听特定端口,准备接收SOAP请求。 - 启动Mule应用...
《深入解析Mule ESB源码》 Mule ESB(Enterprise Service Bus,企业服务总线)是一款...通过深入研究源码,开发者不仅能了解Mule ESB的工作方式,还能优化其性能,解决可能出现的问题,提升整个企业的系统集成能力。
【标题】"Mule 开发使用包"是一个与企业服务总线(Enterprise Service Bus,ESB)相关的学习资源,特别是针对Mule ESB这一...通过深入学习和实践,开发者可以利用Mule ESB的强大功能,高效地解决企业级系统的集成问题。
3. **配置Mule ESB**:在Mule项目中,需要配置一个“Web服务消费者”或者“CXF消费者”组件,指定要调用的Web服务的WSDL(Web服务描述语言)地址,Mule会自动解析WSDL并生成相应的服务代理。 4. **建立Mule流**:在...
### MuleESB3.0中文教程知识点梳理 #### 一、Mule ESB 3.0概述 - **定位**:Mule ESB 3.0是一款轻量级的消息框架和整合平台,旨在帮助企业轻松地集成不同的系统和服务。 - **核心特性**:基于EIP(Enterprise ...
【Mule ESB Studio v3.3 安装使用手册】是针对Mule ESB集成服务平台的一个详细指导,旨在帮助用户成功安装和使用Mule Studio。Mule ESB是一款强大的企业服务总线(ESB)工具,用于构建、部署和管理集成解决方案。...
MuleSoft社区是学习和解决问题的重要平台,用户可以在论坛上提问、分享经验,获取最新资讯和教程。此外,MuleSoft还提供了详尽的在线文档、视频教程和认证课程,助力开发者不断提升技能。 综上所述,Mule ESB凭借其...
在这个特定的实例中,我们关注的是如何使用Mule ESB并行调用多个Web服务接口。这个主题对于那些需要高效处理多个并发请求的系统设计者和开发者来说至关重要。 首先,我们要理解Mule ESB的核心概念。它是基于事件...
"Mule开发环境搭建和部署" Mule是当前流行的企业服务总线(Enterprise Service Bus, ESB),它提供了一个灵活、可扩展、高性能的集成平台。构建Mule开发环境是Mule应用程序的基础,以下将对Mule开发环境的搭建和...
**Mule ESB 3.0 中文教程** Mule ESB(Enterprise Service Bus,企业服务总线)是一款强大的开源集成平台,专为构建可扩展、灵活和可靠的分布式应用程序而设计。Mule ESB 3.0是该平台的一个重要版本,提供了许多...
【Mule Web Service 示例】 Mule ESB(Enterprise Service Bus)是一种强大的集成平台,它允许开发者轻松地构建和部署分布式应用程序。...Mule的灵活性和强大功能使其成为企业级集成解决方案的理想选择。
7. **监控与日志**:为了确保MULE应用的稳定运行,用户需要学会使用内置的监控工具和日志记录功能,以便跟踪应用性能和诊断问题。 8. **安全性和认证**:MULE 3.3支持多种安全机制,包括SSL/TLS加密、认证和授权。...