2016-09-20 11 views
0

クライアントを作成せずに既存のWebサービスを呼び出す必要があります。私は以下のような動的クライアントを生成するためにAXIS Apacheを使用しました。URL引数を使用した動的Webサービス呼び出し

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は文字列の配列を返していましたが、上のコードでは文字列の配列ではなく文字列として戻り値の型を定義していました。だから、これらの2行を追加すると、私の問題は解決しました:)

 //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); 
関連する問題