2012-04-10 80 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