我正在使用提供基本CRUD功能的Web服务。 Retrieve很容易使用,但是我在使用Create时遇到了麻烦(我还没有搞乱更新或删除功能)。
update函数只接受一个参数。这是WSDL中的zObject。但是,这是我实际需要通过的扩展的通用对象。例如,如果我想创建一个帐户,我会传递一个扩展zObject定义的Account对象。
我不能为我的生活弄清楚如何让CF让我这样做。
答案 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();