2016-09-20 116 views
0

我需要在不創建客戶端的情況下調用現有的Web服務。我使用AXIS apache來生成如下所示的動態客戶端。帶有Url參數的動態Webservice調用

try { 
     Service service = new Service(); 
     Call call = (Call) service.createCall(); 
     call.setEncodingStyle("targetNameSpace"); 

     call.setTargetEndpointAddress(new java.net.URL("WSDLURL")); 
     call.setOperationName(new QName("targetNameSpace", "runJob")); 

     call.addParameter("arg0", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN); 

     call.setReturnType(org.apache.axis.Constants.XSD_STRING); 

     String result = (String) call.invoke(new Object[] {"--context=Tokens"}); 
     log.info("result: {}", result); 
     if (!result.equals("0")){ 
      throw new MosApplicationError("Job Failed "); 
     } 

    } catch (Exception e){ 
     throw new MosApplicationError("Talend job failed", e); 
    } 

我的wsdl對請求和響應對象都不使用字符串以外的字符串。運行此代碼時,出現以下錯誤:

11:59:29,424 ERROR [Call] Exception: 
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. 
    at org.apache.axis.encoding.ser.SimpleDeserializer.onStartChild(SimpleDeserializer.java:145) 
    at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035) 
    at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165) 
    at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141) 
    at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236) 
    at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384) 
    at org.apache.axis.client.Call.invoke(Call.java:2467) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at com.nex.mos.job.core.TalendJob.executeJob(TalendJob.java:56) 
    at com.nex.mos.job.core.BaseJob.execute(BaseJob.java:69) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 
11:59:29,496 ERROR [MosErrorHandler] Error processing job in group 'Temporary' implemented by class 'class org.quartz.JobDetail'. Error message: Tal 
end job failed 
com.nex.mos.common.exception.MosApplicationError: Talend job failed 
    at com.nex.mos.job.core.TalendJob.executeJob(TalendJob.java:63) 
    at com.nex.mos.job.core.BaseJob.execute(BaseJob.java:69) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 
Caused by: org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. 
    at org.apache.axis.AxisFault.makeFault(AxisFault.java:101) 
    at org.apache.axis.client.Call.invoke(Call.java:2470) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at com.nex.mos.job.core.TalendJob.executeJob(TalendJob.java:56) 

Caused by: org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. 
    at org.apache.axis.encoding.ser.SimpleDeserializer.onStartChild(SimpleDeserializer.java:145) 
    at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035) 
    at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165) 
    at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141) 
    at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236) 
    at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384) 
    at org.apache.axis.client.Call.invoke(Call.java:2467) 

有沒有人有任何想法?軸版本是1.4和jdk 1.6

在此先感謝。

回答

0

我發現了這個問題。以前我無法正確讀取WSDL文件。我的wsdl正在返回一個字符串數組,但在上面的代碼中,我將返回類型定義爲字符串而不是字符串數組。因此,添加這兩行解決了我的問題:)

 //Return object is array of string 
     call.setReturnType(Constants.SOAP_ARRAY); 
     //Added to marshal and de-marshal the array of string 
     call.registerTypeMapping(String[].class, new QName(talendApplicationName,""), ArraySerializerFactory.class, ArrayDeserializerFactory.class);