2011-11-24 64 views
0

我創建了一個返回Java對象(用戶定義的類)的Java-AXIs2 webservice。在我嘗試使用訪問它的ColdFusion這個訪問Java Web服務時出現Coldfusion錯誤

<cfset wsObj=createobject("webservice","http://localhost:8080/FFMpegHelperServices/services/TranscodeVideoFileFactoryWS?wsdl")> 

當我嘗試訪問該wsObj,並做一些操作,我收到以下錯誤

Cannot perform web service invocation getTranscodeVideoFile. The fault returned when invoking the web service operation is:<br> <pre>AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:314) 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:2448) at org.apache.axis.client.Call.invoke(Call.java:2347) at org.apache.axis.clien... ''</pre> <br>The error occurred on line 34. 

任何人有任何想法hopw來處理這個。

WebService類看起來像這樣

public class TranscodeVideoFileFactoryWS { 

    private TranscodeVideoFile[] temp = new TranscodeVideoFile[1]; 

    public String getTranscodeVideoFile() { 
     return "nasir"; 
    } 

} 

我要訪問返回該類。

回答

2

您的問題的關鍵在於錯誤的這一部分中隱藏:

No deserializer for 

你想消費正在與定製的數據類型的Web服務; Web服務要麼需要一個參數,要麼返回一個值......這是CF不能理解的變量類型(比如自定義類)。

不幸的是,要解決這個問題,您需要深入瞭解web服務的內核,並瞭解您是否可以在您的最終實現這些自定義類型。

- 編輯 -

基於Java類的註釋說明,當它被初始化,私有變量被instatiated:

private TranscodeVideoFile[] temp = new TranscodeVideoFile[1]; 

雖然不直接關係到你的方法呼叫,它被創建爲您的初始CreateObject()的一部分,因此,正在嘗試以某種身份保存在隨後的對象調用中。不幸的是,那個類是CF的自定義和未知的,並且如果繼續這個開發路徑,將會產生一個反序列化錯誤。

有一個解決方案......但在這種情況下也有一個「正確的事情」。

解決方案

用手,這使ColdFusion的意識到它們添加編譯的類的WebService存根目錄,這樣,當你調用的Web服務方法,ColdFusion的知道如何處理類,並適當地序列化/反序列化它們。

我在使用Netsuite API時使用了this process幾個月,信用:Jeremy Gibbens。您還需要對ColdFusion工具進行一些研究,該工具允許生成存根(stub)ad-hoc - 該工具是wsdl2java。

Dated article on Wsdl2Java,但是相關的。

「正確的事」

如果可以,不要過度使用SOAP自定義類型的工作。如果你有控制包裝FFMpeg Helper對象的代碼,並且對服務本身有貢獻 - 不要寫任何處理自定義類的代碼。使用ColdFusion理解的類型。

ColdFusion-compatible datatypes for use in Web Services

+0

WebService類看起來像這樣公共類TranscodeVideoFileFactoryWS { \t \t 私人TranscodeVideoFile []臨時=新TranscodeVideoFile [1]; \t \t public String getTranscodeVideoFile(){ \t \t return「nasir」; \t} \t } 我想要訪問正在返回的類。 – nasaa

+0

我已將您的代碼添加到問題中,因此每個人都可以更輕鬆地閱讀它 – duncan

+0

解答澄清。 –