2

SOAP Web サービスとして ?wsdl を使用してアクセスする CFC があります。

ブラウザーで 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;
}

したがって、Web サービスとして使用している CFC には、関数内で別の CFC が宣言されています。Web サービス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 関数はこれを返しています。

4

2 に答える 2

2

関数に Web サービスとしてアクセスするには、関数をリモートとして宣言する必要があります。機能自体は問題ありません。そのため、Web ブラウザーで手動でプルアップできます。

remote function doStuff(foo){ }
于 2012-04-10T14:12:59.513 に答える
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

于 2012-04-11T09:48:55.560 に答える