【webservice】818开发webservice过程中遇到的异常

还是关于axis2的知识哦。webservice的开发,包括服务端的开发、客户端的开发。在“服务端的开发”方面通常是部署好axis2的环境、完成工程的设计与编程、打包发布,一般来说不会出现异常(前提是基本功扎实),然而,在“客户端的开发”方面就不好说了。下面就简单说一下客户端开发可能会出现的问题吧。

1、生成客户端代码时报错。例如用axis2的生成工具去搞axis1的wsdl(这个可以参考前面的博文哦),报错信息是org.apache.axis2.wsdl.codegen.CodeGenerationException  : java.lang.RuntimeException: java.lang.reflect.InvocationTargetException。网上的说法一致是wsdl有问题,说法是正确的,但不够详细。后来webservice服务端厂家提示要用axis1的生成工具,这才解决了问题。貌似没看到其他朋友有这样的遭遇呢,犯错就是学习,呵呵。

2、axis2生成CXF的webservice的wsdl。有一次遇到一个wsdl,和平时看的axis2的wsdl有点不一样,而最后还是可以顺利生成客户端代码,也就是stub类。但是,拿到了这个stub类,却不能和平常一样写客户端代码(平常的做法是,new一个stub类对象,直接调用其子类、子方法就完事了)。后来有群友帮忙,才知道这是csf生成的wsdl,热心的群友还帮我生成了cxf的客户端代码。可是我用axis2的啊,但是还是非常感谢他。再后来,我问厂家拿了报文,根据报文的xml(是soap协议的)一步一步调用才解决了问题。说多了都是泪,直接上代码:

//set值过程  --- 注意参考报文
ISPPNPIServiceStub sub = new ISPPNPIServiceStub();
ISPPNPIServiceStub.Root rootSend = new ISPPNPIServiceStub.Root();
ISPPNPIServiceStub.Msg_head rMsg_head = new ISPPNPIServiceStub.Msg_head();
ISPPNPIServiceStub.Interface_msg rInterfaceMsg = new ISPPNPIServiceStub.Interface_msg();
ISPPNPIServiceStub.Directive rDirective = new ISPPNPIServiceStub.Directive();
ISPPNPIServiceStub.ServiceClass rServiceClass = new ISPPNPIServiceStub.ServiceClass();
ISPPNPIServiceStub.ServiceSubClass rServiceSubClass = new ISPPNPIServiceStub.ServiceSubClass();
ISPPNPIServiceStub.Method rMethod = new ISPPNPIServiceStub.Method();
rMsg_head.setTime("String");
rMsg_head.setFrom("String");
rMsg_head.setTo("String");
rMsg_head.setMsg_type("String");
rMsg_head.setSerial(ipString);
rMethod.setName("IssuePpcCard");//对于报文:<Method Name="IssuePpcCard"> 
rMethod.setMDN(number);
rMethod.setPWD(pwd);
rServiceSubClass.setName("CSPpcMemberService");
rServiceSubClass.setName("CSService");
rServiceSubClass.setMethod(rMethod);
rServiceClass.setServiceSubClass(rServiceSubClass);
rDirective.setServiceClass(rServiceClass);
rInterfaceMsg.setDirective(rDirective);
rootSend.setInterface_msg(rInterfaceMsg);
rootSend.setMsg_head(rMsg_head);
				
ISPPNPIServiceStub.Root rootRS = sub.SYNNPIAPI(rootSend, null, null, null, null);
ISPPNPIServiceStub.ResponseSubClass responseSubClass = new ISPPNPIServiceStub.ResponseSubClass();
responseSubClass = rootRS.getInterface_msg().getMsg_response().getResponseClass().getResponseSubClass();
				
String returnData = JSONObject.fromObject(responseSubClass).toString();

3、查询超时。这个异常就是connect timeout了,因为服务端数据量太大,查询速度慢,返回数据也比较多,整个调用过程超出了默认的时间,解决办法是在生成的stub类的构造函数(有多个哦,别弄错了哦)里面添加这行: _serviceClient.getOptions().setTimeOutInMilliSeconds(600000L);//10 mins timeout。这样一来,stub类实例化的时候会重设连接时间。

4、出现常见的 nullPointException、sqlException等等,那估计就是自己的代码有问题了。

总而言之:服务端开发一般不出错;客户端开发时,先问厂家拿wsdl和url,调不通就问厂家拿报文就是了,如果拿了报文后还是怎么弄也弄不好?最后一招:放弃axis,直接写servlet(也就是要弄javaweb系统了)!

老鸟勿喷哦~ 转载请说明出自whilejolly:http://blog.csdn.net/seedingly/article/details/39052189

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。