还是关于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); 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