当前位置:编程学习 > JAVA >>

axis2客户端不能调到web service的问题

已有web service,用axis2的wsdl2java生成了客户端,但发现调用进入stub类之后,在执行的地方直接跳过,而且不进异常处理,直接进入到finally,如下:

 

//execute the operation client
 _operationClient.execute(true);//这一步在赋好值之后调用实际的远程web service,以下的代码都是直接跳过
org.apache.axis2.context.MessageContext _returnMessageContext = _operationClient.getMessageContext(
                                           org.apache.axis2.wsdl.WSDLConstants.MESSAGE_LABEL_IN_VALUE);
                org.apache.axiom.soap.SOAPEnvelope _returnEnv = _returnMessageContext.getEnvelope();
                
                
                                java.lang.Object object = fromOM(
                                             _returnEnv.getBody().getFirstElement() ,
                                             com.hikvision.cms.ws.client.DeviceStub.SetOneRecordPlanResponse.class,
                                              getEnvelopeNamespaces(_returnEnv));

                               
                                        return (com.hikvision.cms.ws.client.DeviceStub.SetOneRecordPlanResponse)object;
                                   
         }catch(org.apache.axis2.AxisFault f){//异常捕获也被直接跳过

            org.apache.axiom.om.OMElement faultElt = f.getDetail();
            if (faultElt!=null){
                if (faultExceptionNameMap.containsKey(faultElt.getQName())){
                    //make the fault by reflection
                    try{
                        java.lang.String exceptionClassName = (java.lang.String)faultExceptionClassNameMap.get(faultElt.getQName());
                        java.lang.Class exceptionClass = java.lang.Class.forName(exceptionClassName);
                        java.lang.Exception ex=
                                (java.lang.Exception) exceptionClass.newInstance();
                        //message class
                        java.lang.String messageClassName = (java.lang.String)faultMessageMap.get(faultElt.getQName());
                        java.lang.Class messageClass = java.lang.Class.forName(messageClassName);
                        java.lang.Object messageObject = fromOM(faultElt,messageClass,null);
                        java.lang.reflect.Method m = exceptionClass.getMethod("setFaultMessage",
                                   new java.lang.Class[]{messageClass});
                        m.invoke(ex,new java.lang.Object[]{messageObject});
                        

                        throw new java.rmi.RemoteException(ex.getMessage(), ex);
                    }catch(java.lang.ClassCastException e){
                       // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.ClassNotFoundException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    }catch (java.lang.NoSuchMethodException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    } catch (java.lang.reflect.InvocationTargetException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    }  catch (java.lang.IllegalAccessException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    }   catch (java.lang.InstantiationException e) {
                        // we cannot intantiate the class - throw the original Axis fault
                        throw f;
                    }
                }else{
                    throw f;
                }
            }else{
                throw f;
            }
            } finally {  //跳过异常来到了finally
                _messageContext.getTransportOut().getSender().cleanup(_messageContext);
            }



以前做的web service客户端没有用过axis2,因此这种问题也没有遇到过,究竟是我生成的客户端代码有问题(我找过N个同事一起生成过了,全部换了一遍,都不行;但别的组的同事同样也对这个web service生成客户端,是成功的)还是怎么回事,请有经验的大虾给个提示,不胜感激 --------------------编程问答-------------------- 你怎么直接用这个类的内容,用这个类的对象即可。调用暴露的方法就行了。 --------------------编程问答--------------------
引用 1 楼 fangmingshijie 的回复:
你怎么直接用这个类的内容,用这个类的对象即可。调用暴露的方法就行了。


用的是这个类的对象
我上面写的是调用这个类的方法之后,进入这个类的方法的执行情况 --------------------编程问答-------------------- 贴代码。.... --------------------编程问答--------------------
引用 3 楼 fangmingshijie 的回复:
贴代码。....


关键代码如下:


try {
StringBuffer wsUrl = new StringBuffer();
wsUrl.append("http://").append(vrmIP).append(":").append(vrmPort).append(ConstParamRecordPlan.DEVICE_WS_URL);
DeviceStub stub = new DeviceStub(wsUrl.toString());//这个是生成的客户端
DeviceStub.RecordPlan recordPlanWS=changeToDeviceStubRecordPlan(recordPlan);//将传来的参数转换为客户端需要的类型
DeviceStub.SetOneRecordPlan recordPlanWapper=new DeviceStub.SetOneRecordPlan();
recordPlanWapper.setPlan(recordPlanWS);

DeviceStub.SetOneRecordPlanResponse response=stub.setOneRecordPlan(recordPlanWapper);//调用方法,贴子正文中的错误就是在这一步里发生的
return response.getSetOneRecordPlanResult();
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,