jdk6 webservice根据客户端代码编写和调试服务器端代码心得

 

 

客户端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底层帮我们做了处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值