ColdFusion,WSDL和扩展的复杂类

时间:2009-10-21 20:02:50

标签: coldfusion web-services wsdl

我正在使用提供基本CRUD功能的Web服务。 Retrieve很容易使用,但是我在使用Create时遇到了麻烦(我还没有搞乱更新或删除功能)。

update函数只接受一个参数。这是WSDL中的zObject。但是,这是我实际需要通过的扩展的通用对象。例如,如果我想创建一个帐户,我会传递一个扩展zObject定义的Account对象。

我不能为我的生活弄清楚如何让CF让我这样做。

2 个答案:

答案 0 :(得分:3)

ColdFusion为其Web服务功能实现了Apache Axis引擎。  不幸的是,CF没有充分利用SOAP对象模型并允许  CF开发人员“新”构成服务的不同对象(或它们的子类)。

谢天谢地,我们可以做些什么。首次访问WSDL时  Axis生成一组存根对象。这些是包含的常规java类  getter和setter用于对象的基本属性。我们需要使用这些  存根来构建我们的对象。

但是,为了使用这些存根,我们需要将它们添加到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 :(得分:1)

我同意对ColdFusion的批评,但是,发布的解决方案对wsdl的更改也没有很好的反应。

值得庆幸的是,CF可以访问对象上的所有底层Java方法。这包括“反思”。虽然CreateObject不知道存根对象,但创建Web服务的类加载器会这样做。

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