2012-04-10 48 views
2

我有一個CFC,我將使用?wsdl作爲SOAP Web服務訪問。Coldfusion Web服務無法看到組件

如果我直接在瀏覽器中調用CFC,我的結果呈現罰款:

http://server/webservice/calc.cfc?method=doStuff&foo=bar 

如果我嘗試訪問它作爲一個Web服務:

ws = CreateObject("webservice", 'http://server/webservice/calc.cfc?wsdl'); 
result = ws.doStuff('bar'); 

我得到一個錯誤:

Cannot perform web service invocation doStuff. 

The fault returned when invoking the web service operation is: 
AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException 
faultSubcode: 
faultString: coldfusion.xml.rpc.CFCInvocationException: 
[coldfusion.xml.rpc.CFCInvocationException : [java.lang.ClassNotFoundException : 
com.calculations.calc][java.lang.NullPointerException : null]] 
faultActor: 
faultNode: 
faultDetail: 
    {http://xml.apache.org/axis/}stackTrace:coldfusion.xml.rpc.CFCInvocationException:   [coldfusion.xml.rpc.CFCInvocationException : [java.lang.ClassNotFoundException :  
com.calculations.calc][java.lang.NullPointerException : null]] 
    at  coldfusion.xml.rpc.CFComponentSkeleton.__createCFCInvocationException(CFComponentSkeleton.java:733) 
    at coldfusion.xml.rpc.CFComponentSkeleton.__convertOut(CFComponentSkeleton.java:359) 
    at webservice.calc.doStuff(/var/www/vhosts/server/httpdocs/webservice/calc.cfc) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.r... '' 

問題是因爲doStuff函數正在聲明其中的一個CFC實例:

remote struct function doStuff(foo) { 
    var objReturn = {}; 
    objReturn.msg = 'A message'; 

    // do a calculation 
    var objCalc = new com.calculations.calc(foo); 
    objReturn.calc = objCalc; 

    return objReturn; 
} 

所以我的CFC,我使用的Web服務得到了被聲明的函數內的另一個CFC。直接瀏覽我的web服務CFC工作正常,但嘗試使用CreateObject/webservice路由調用它失敗,因爲它不能創建組件的實例。

UPDATE:

如果我刷新頁面幾次,有時是錯誤的更改:

AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException 
faultSubcode: 
faultString: coldfusion.xml.rpc.CFCInvocationException: 
    [coldfusion.xml.rpc.CFCInvocationException : [java.lang.ClassNotFoundException :  
    com.calculations.calc][coldfusion.xml.rpc.CFCInvocationException : 
    returnType must  be defined for remote CFC functions.]] 
    faultActor: 
    faultNode: 
    faultDetail: 
    {http://xml.apache.org/axis/}stackTrace:coldfusion.xml.rpc.CFCInvocationException: 
    [coldfusion.xml.rpc.CFCInvocationException : [java.lang.ClassNotFoundException : 
    com.calculations.calc][coldfusion.xml.rpc.CFCInvocationException : 
    returnType must be defined for remote CFC functions.]] 
    at coldfusion.xml.rpc.CFComponentSkeleton.__createCFCInvocationException(CFComponentSkeleton.java:733) 
at coldfusion.xml.rpc.CFComponentSkeleton.__convertOut(CFComponentSkeleton.java:359) 
at webservices.TaxCalc.feed.getTaxCalc(/var/www/vhosts/server/httpdocs/webservice/calc.cfc) 
at sun.reflect.Nat... '' 

這是要求返回類型,但com.calculations的初始化FUNC .calc有返回這個;

+0

錯誤消失,如果我註釋掉線** objReturnl.calc = objCalc **。它將聲明計算對象,但不允許我返回它。 – 2012-04-10 15:26:38

回答

1

好吧,這並沒有真正回答爲什麼錯誤被拋出的問題,但我找到了解決方法。除了使用此代碼:

objReturn.calc = objCalc; 

我用這個來代替:

objReturn.calc.arrOne = objCalc.getArrOne(); 
objReturn.calc.arrTwo = objCalc.getArrTwo(); 

而且它的正常工作。我猜這個問題是由於組件無法被轉換爲WSDL數據的事實。我正在考慮把CFC看作一個結構體,它不是因爲它有許多附加的方法。

所以我不應該試圖分配CFC,我應該使用訪問器訪問CFC內的數據。

回答也的Abobe論壇:http://forums.adobe.com/message/4326548

+0

實際上,我猜想它確實回答了這個問題,Coldfusion服務器不能用方法和參數等將整個CFC轉換爲Web服務的數據。 – 2012-04-11 09:49:48

2

您的函數需要聲明爲遠程才能以web服務的身份訪問它。該功能本身很好,這就是爲什麼您可以在Web瀏覽器中手動將其拉起。

remote function doStuff(foo){ } 
+0

對不起,你已經到位了。我已經更新了我原來的問題。 – 2012-04-10 15:20:56