ColdFusion, WSDL и расширенные сложные классы - PullRequest
1 голос
/ 22 октября 2009

Я работаю с веб-сервисом, который предоставляет базовую функциональность CRUD. С Retrieve достаточно легко работать, но у меня возникают проблемы при работе с Create (я еще не перепутал функции Update или Delete).

Функция обновления принимает один аргумент. Это zObject в WSDL. Тем не менее, это общий объект, расширенный тем, что мне действительно нужно передать. Например, если я хочу создать учетную запись, я передаю объект Account, который расширяет определение zObject.

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

Ответы [ 2 ]

3 голосов
/ 22 октября 2009

ColdFusion реализует движок Apache Axis для своей функциональности веб-службы. К сожалению, CF не в полной мере использует объектную модель SOAP и не позволяет Разработчики CF «создают» различные объекты, составляющие службу (или подклассируют их).

К счастью, мы можем с этим что-то сделать. Когда вы впервые получаете доступ к WSDL, Ось генерирует набор объектов-заглушек. Это обычные классы Java, которые содержат геттеры и сеттеры для базовых свойств объекта. Нам нужно использовать эти заглушки, чтобы построить наш объект.

Однако, чтобы использовать эти заглушки, нам нужно добавить их в ColdFusion путь к классу:

Step 1) Access the WSDL in any way with coldfusion.
Step 2) Look in the CF app directory for the stubs. They are in a "subs"
        directory, organized by WSDL.like:
        c:\ColdFusion8\stubs\WS\WS-21028249\com\foo\bar\
Step 3) Copy everything from "com" on down into a new directory that exists in
        the CF class path. or we can make one like:
        c:\ColdFusion8\MyStubs\com\foo\bar\
Step 4) If you created a new directory add it to the class path.
        A, open CF administrator
        B. click on Server settings >> Java and JVM
        C. add the path to "ColdFusion Class Path". and click submit
        D. Restart CF services.
Step 5) Use them like any other java object with <CFObject /> or CreateObject()
        MyObj = CreateObject("java","com.foo.bar.MyObject");
        Remember that you can CFDump the object to see the available methods.
        <cfdump var="#MyObj#" />

Ваш объект аккаунта ДОЛЖЕН быть в заглушках. Если вам нужно создать его по какой-то причине, вам нужно сделать это в новом файле класса Java

Обычно при работе с таким большим количеством Java cfscript - это путь.

наконец, код будет выглядеть так:

<cfscript>
    // create the web service
    ArgStruct = StructNew();
    ArgStruct.refreshWSDL = True;
    ArgStruct.username = 'TestUserAccount';
    ArgStruct.password = 'MyP@ssw0r3';
    ws = createObject("webservice", "http://localhost/services.asmx?WSDL",ArgStruct);


        account = CreateObject("java","com.foo.bar.Account");
        account.SetBaz("hello world");
        ws.Update(account);
</cfscript>
1 голос
/ 11 февраля 2012

Я согласен с критикой ColdFusion, однако опубликованное решение также не очень хорошо реагирует на изменения wsdl.

К счастью, CF обеспечивает доступ ко всем базовым Java-методам на объектах. Это включает в себя «отражение». Хотя CreateObject не знает об объектах-заглушках, загрузчик классов, создавший веб-сервис, знает.

ws = createObject("webservice", "http://localhost/services.asmx?WSDL",ArgStruct); account = ws.getClass().getClassLoader().loadClass('com.foo.bar.Account').newInstance();

...