【问题标题】:Coldfusion web service failing to see componentColdfusion Web 服务无法看到组件
【发布时间】:2014-06-03 21:37:13
【问题描述】:

我有一个 CFC,我将使用 ?wsdl 作为 SOAP Web 服务进行访问。

如果我直接在浏览器中调用 CFC,我的结果会很好:

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

如果我尝试将其作为网络服务访问:

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;
}

因此,我用作 Web 服务的 CFC 在函数中声明了另一个 CFC。直接浏览到我的 webservice CFC 工作正常,但尝试使用 CreateObject/webservice 路由调用它失败,因为它无法创建 com.calculations.calc 组件的实例。

更新:

如果我刷新页面几次,有时错误会变为:

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.calc 的 init func 有 return this;

【问题讨论】:

  • 如果我注释掉 objReturnl.calc = objCalc 行,错误就会消失。它将声明计算对象但不允许我返回它。

标签: web-services coldfusion wsdl components cfc


【解决方案1】:

您的函数需要声明为远程才能将其作为 Web 服务访问。该功能本身很好,这就是为什么您可以在网络浏览器中手动拉出它的原因。

remote function doStuff(foo){ }

【讨论】:

  • 很抱歉,您是对的,但这已经到位。我已经更新了我原来的问题。
【解决方案2】:

好的,这并不能真正回答为什么会引发错误的问题,但我找到了一种解决方法。而不是使用此代码:

objReturn.calc = objCalc;

我用这个代替:

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

而且它运行良好。我想这个问题与组件无法转换为 WSDL 的数据有关。我曾将 CFC 视为一个结构,但它并非如此,因为它附加了许多方法。

所以我不应该尝试分配 CFC,我应该使用访问器来访问 CFC 内的数据。

也在 Abobe 论坛上回答:http://forums.adobe.com/message/4326548

【讨论】:

  • 实际上我想它确实回答了这个问题,Coldfusion 服务器无法将带有方法和参数等的整个 CFC 转换为 Web 服务的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多