您的位置:首页 > 编程语言 > Java开发

java开发webservcie时关于特殊字符的问题

2007-11-03 13:51 459 查看
1、昨天我们解决了一个困挠了我们一个星期的问题,完成之后项目组的所有兄弟大吼一声,这个问题其实本身并不困难。现将问题已经解决的过程整理以供大家日后参考
问题背景
我们的整个硬件环境有5台服务器,其中四台服务器放着数据和操作系统还有我们的应用(一个j2ee的应用),还有一台机器是作为控制机来使用的。这5台机器中除了控制机外其他的机器都不能访问外网(客户的要求),但是系统有一个发送短信的功能,而短信网关是在外网,因此需要在控制机上面架设一个网关,通过该网关来发送短信。经过研究觉得我们采用webservice技术来实现这个网关,java中的webservie我们最熟悉的就是axis和xfire,因为我们的系统采用的是基于spring的架构,因此我们决定采用xfire。
网关准备好了现在我们要开始发短信了,我们的短信内容是从运行营商现有的系统中取过来的,取数据的方式是采用socket的方式取的,对方的系统是采用c/c++开发的。
网关好了,短信的内容也好了,现在改发短信了,也开始我们长达一个星期的炼狱历程。第一次发送的时候出现了错误:xfire提示数据报文里面有一个违法的字符,于是我们检查了报文,发现没有违法的字符,于是上xfire的论坛查和xfire相关的资料,发现没有这些问题,于是我们继续找(老板在崔啊),但是还是没有明确的结果。这个时候我们怀疑是不是操作系统的问题,于是换了操作系统,还是报错误。这个时候我们开始怀疑是不是xifre的问题,于是我们将webservice引擎更换成axis,结果还是报错,我们都无语了。到底是怎么回事呢。
这个时候我仔细分析了一下axis的错误日志(axis的错误日志比xifire要全面)发现axis提示是短信的最后一个字符是一个非法字符,可是短信内容的组合一个字符是一个”;“,这不是一个违法字符啊。突然我想起来,内容是我从客户的现有系统中通socket接口提取出来的
对方的系统是c/c++ 开发的,而c/c++和java在字符串结束的时候采用的换行符号是不一样的
而我们的短信是截取客户系统发过来的数据的最后一段,会不会是这个问题呢。于是我马上测试一下客户发过来的程序的最后一段的长度,果然和显示的长度相差一个字符。原来在客户系统传递过来的字符中,在字符的最后隐藏一个看不见的字符,就是这个字符导致了webservice报文的错误(冤枉了xfire,不过xfire也确实需要在日志的精确度上面下功夫了),于是修改程序将最后一个字符去掉,结果所有的错误都解决了。:-)
通过这次经历得出一下体会
1、在解决bug的时候,特别是程序中有多个层或者是和第三方系统有集成的时候,可以采用分段的方法来解决这个问题,即先确定问题出现在那个层,如果我们当时遇到错误的时候用一个字符串来代替客户的数据,说不定能早点发现问题
2、在采用webservcie开发跨语言的系统的时候,移动考虑一下特殊字符在不用语言中的表现形式,因为webservice是基于文本的,对一些特殊字符很敏感。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: