Веб-служба Coldfusion не видит компонент

У меня есть CFC, к которому я собираюсь получить доступ с помощью ?wsdl в качестве веб-службы SOAP.

Если я вызываю 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;
}

Итак, мой CFC, который я использую в качестве веб-службы, имеет еще один CFC, объявленный внутри функции. Непосредственный просмотр моего веб-сервиса 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 возвращает это.


person Pete    schedule 10.04.2012    source источник
comment
Ошибка исчезнет, ​​если я закомментирую строку objReturnl.calc = objCalc. Он объявит объект расчета, но не позволит мне его вернуть.   -  person Pete    schedule 10.04.2012


Ответы (2)


Ваша функция должна быть объявлена ​​удаленной, чтобы получить к ней доступ как к веб-сервису. Сама функция в порядке, поэтому вы можете вручную вызвать ее в веб-браузере.

remote function doStuff(foo){ }
person Busches    schedule 10.04.2012
comment
Извините, вы правы, но это уже на месте. Я обновил свой исходный вопрос. - person Pete; 10.04.2012

Хорошо, это на самом деле не отвечает на вопрос, почему возникла ошибка, но я нашел обходной путь. Вместо использования этого кода:

objReturn.calc = objCalc;

Вместо этого я использовал это:

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

И это работает нормально. Я предполагаю, что проблема связана с тем, что компонент не может быть преобразован в данные для WSDL. Я думал о CFC как о структуре, а это не так, поскольку к ней привязано множество методов.

Поэтому я не должен пытаться назначать CFC, я должен использовать средства доступа для доступа к данным внутри CFC.

Ответьте также на форумах Abobe: http://forums.adobe.com/message/4326548

person Pete    schedule 11.04.2012
comment
На самом деле я полагаю, что это действительно отвечает на вопрос, сервер Coldfusion просто не может превратить весь CFC с методами, параметрами и т. д. в данные для веб-сервиса. - person Pete; 11.04.2012