客户端jdk为jdk1.6.0版本
短信接口客户端项目中的
服务器端jdk为jdk1.6.0版本
短信接口服务器端
1、由于使用jdk1.6.0版本,需要将使用jdk6的方法生产代码,可参照如下
命令如下:
D:\workspace\TServer>wsgen -cp.\WebRoot\WEB-INF\classes -s .\src -d .\src cn.sh
anli.webServiceInterface.MasSmsInterface
2、修改生成的类的包名为如下,必须和实现类中方法注解中的className一致,与客户端的className比较的话,多了一个sunline包名,和客户端的主要存放相关类的包路径一致
失败原因分析:
1、由于使用jdk版本不一致导致,原来的是jdk1.6.0_43,生产环境使用的是jdk1.6.0,版本的差异会导致使用jdk实现的webservice有差异,类结构目录页不一样,之前一直忽略了jdk的问题,因为感觉版本差距不大,应该不会有大的影响
2、服务器端使用wsimport生产的类的包名需要改成com.sunline.shanli.webservice.client
实现类中方法的注解中的className路径不对的话,正确的是className = "com.sunline.shanli.webservice.client.SendSingleSMS"报错如下
实现类中的方法需要配置注解,配置如下,className = "com.sunline.shanli.webservice.client.SendSingleSMS
Jdk1.6.0需要配置如上注解,如果没有添加注解配置的话会报错,报错信息如下;
报错信息:
严重: Error in decoding SOAP Message
Error in decoding SOAP Message
atcom.sun.xml.internal.ws.encoding.soap.server.SOAPXMLDecoder.toInternalMessage(SOAPXMLDecoder.java:91)
atcom.sun.xml.internal.ws.protocol.soap.server.SOAPMessageDispatcher.toMessageInfo(SOAPMessageDispatcher.java:189)
atcom.sun.xml.internal.ws.protocol.soap.server.SOAPMessageDispatcher$SoapInvoker.invoke(SOAPMessageDispatcher.java:573)
atcom.sun.xml.internal.ws.protocol.soap.server.SOAPMessageDispatcher.receive(SOAPMessageDispatcher.java:143)
atcom.sun.xml.internal.ws.server.Tie.handle(Tie.java:90)
atcom.sun.xml.internal.ws.transport.http.server.WSHttpHandler.process(WSHttpHandler.java:173)
atcom.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(WSHttpHandler.java:121)
atcom.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(WSHttpHandler.java:97)
atcom.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:65)
atsun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:65)
atcom.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:68)
atsun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:556)
atcom.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:65)
atsun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:528)
atjava.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
atjava.lang.Thread.run(Thread.java:619)
Caused by: javax.xml.ws.soap.SOAPFaultException: Cannot find the dispatch method
atcom.sun.xml.internal.ws.encoding.soap.SOAPDecoder.raiseFault(SOAPDecoder.java:654)
atcom.sun.xml.internal.ws.encoding.soap.server.SOAPXMLDecoder.decodeDispatchMethod(SOAPXMLDecoder.java:154)
atcom.sun.xml.internal.ws.encoding.soap.SOAPDecoder.decodeBodyContent(SOAPDecoder.java:318)
atcom.sun.xml.internal.ws.encoding.soap.SOAPDecoder.decodeBody(SOAPDecoder.java:308)
atcom.sun.xml.internal.ws.encoding.soap.SOAPDecoder.decodeEnvelope(SOAPDecoder.java:231)
atcom.sun.xml.internal.ws.encoding.soap.server.SOAPXMLDecoder.toInternalMessage(SOAPXMLDecoder.java:83)
...16 more
classcom.sunline.sms.smsSended.service.impl.SmsServiceImpl查询送达客户短信返回值:【3】
解决思路:
1、首先可以使用tcpMon监听tcp请求,需要将监听端口和实际端口不一样
2、根据客户端代码可以判断是使用的jdk自带的JAX-WS 实现的
3、关注jdk的版本是否一致,因为使用了jdk自带的功能,各个版本实现不同
4、通过tcpMon监测到客户端发来的请求是jdk1.6.0版本,而我本地的是jdk1.6.0_43版本,它们差别还是比较大,中间有好多个版本
5、 使用不同的jdk版本导致的TCP请求也有变化,在较高jdk6版本下会发送两个请求,第一次是get xxxService ?wsdl请求,第二次是post xxxService 请求
而使用了jdk6.0版本时只有一个post xxxService 请求,原因还没搞清楚
6、返回xml格式的数据时,采用StringBuffer 方式拼接,在tcpMon里看到的请求中“<”,">"被转义了,还有就是我本地MyEclipse输出的倒是正常,但是空格变成了“?”,后来把编码设定了一下就正常了,开始我还在纠结怎么才能不让它转义,后来我发现在客户端那边的输出中显示是正常的,应该是jdk底层帮我们做了处理