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生成客户端,是成功的)还是怎么回事,请有经验的大虾给个提示,不胜感激 --------------------编程问答-------------------- 你怎么直接用这个类的内容,用这个类的对象即可。调用暴露的方法就行了。 --------------------编程问答--------------------
用的是这个类的对象
我上面写的是调用这个类的方法之后,进入这个类的方法的执行情况 --------------------编程问答-------------------- 贴代码。.... --------------------编程问答--------------------
关键代码如下:
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