我通过ColdFusion调用Web服务返回一个对象,我想验证此对象的某个方法是否存在,因为它不会一直存在。
我发现this source似乎很有希望但是根据我的测试我可以看到结果总是消极的,而且当它明显存在时,方法永远找不到。
<cfif structKeyExists("#Result.getNotifications().getValidationResult(0)#","getField")>
Result
是我的基础对象,我的最终目标是验证方法getField()
是否存在。
与try / catch相比,有没有一种干净的方法呢?
答案 0 :(得分:2)
<强>更新强>
不幸的是,我不确定IsInstanceOf()
是否适用于Web服务,因为CF使用了一个Proxy对象来包装&#34;底层的Web服务类。如果没有,另一个简单的选择是检查类名。这避免了仅检查方法名称的模糊性(可能存在于许多不同的类中)。另外,我怀疑它可能比IsInstanceOf()
更轻盈。
<cfif compare(yourObject.getClass().name, "org.tempuri.ValidationResultField") eq 0>
Found ValidationResultField. do something
</cfif>
转储看起来像包含几种不同类型的对象/类:ArrayOfValidationResult
,ValidationResultField
,etecetera。听起来你真正想要确定的是你正在使用哪些类,因此你可以根据Web服务定义准确地知道哪些字段和方法可用。鉴于此,我认为IsInstanceOf()比检查方法名称更合适。更准确。没有什么能阻止两个不同的类具有相同的方法名称。因此,即使方法X或Y存在,仍然有可能可能可能<= em>与预期不同的类。
<cfif IsInstanceOf(yourObject, "org.tempuri.ValidationResultField")>
do something
</cfif>
答案 1 :(得分:0)
据我所知,提到的structKeyExists
方法仅在CF内部包装类时才有效,例如: cfcomponent
的所有实例。
唯一的选择是实际reflect the class:
<cftry>
<cfset Result.getNotifications().getValidationResult(0).getClass().getMethod("getField", javaCast("null", ""))>
<!--- method does exist --->
<cfcatch type="coldfusion.runtime.CfJspPage$UnsupportedBaseTypeException">
<!--- method does not exist --->
</cfcatch>
</cftry>
如果该方法不存在,则会抛出UnsupportedBaseTypeException
,这似乎是NoSuchMethodException
的后续行动。
老实说,您也可以调用该方法并捕获它。反思带来了额外的开销,无论如何你必须抓住它。
答案 2 :(得分:-1)
与Miguel-F一样,我认为这适用于getMetadata()。以下内容应返回一个包含对象各自功能的数组:
<cfset funcs = getmetadata(nameOfObj).functions>
函数的名称是funcs [1] .name,funcs [2] .name等。
答案 3 :(得分:-1)
通常,您可以在给定WSDL的URL的情况下获取Web服务的所有功能的元数据,例如
<cfhttp method="get" url="http://www.webservicex.net/globalweather.asmx?WSDL" result="res">
<cfset wsXml=xmlparse(res.filecontent)>
<cfset wsOperations = xmlsearch(wsXml,"//wsdl:operation")>
<cfdump var="#wsOperations#">
您可以查看的另一种方法(可能是未记录的)是从存根目录中的类名中获取方法名称。
要运行的代码是:
<cfscript>
wsargs = structnew();
wsargs.savejava="yes";
</cfscript>
<cfset convert=createobject("webservice","url_of_wsdl",wsargs)>
然后弄清楚如何从存根目录{CF_INSTALL} / stubs中删除名称。就我而言,CF_INSTALL是C:/ ColdFusion2016 / cfusion /