使用mule生成WSDL中文乱码问题解决方法
??????? 在发布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方法果然被重写:
??????? 从mule的配置中得到配置的编码格式,并在将Stream转换为String的时候指定使用此编码格式.至此问题解决了.
??????? 我们可以在使用mule发布服务时,使用WSDLDocumentation标签来为服务添加描述了.wsdl作为WebService的描述,如果没有注释性的文字,wsdl描述可读性实在不是很好. WSDLDocumentation标签就是作为这种描述存在的,如果你想在WSDL中加入中文的描述这个标签应该是唯一的选择.如果你使用的也是mule,也遇到了中文的乱码问题,希望可上面的内容可以帮助你。
?
作者本人将原文转发到此,原文地址为:http://www.oecp.cn/hi/slx/blog/2315