验证对象的方法是否存在

时间:2016-10-19 19:01:22

标签: coldfusion

我通过ColdFusion调用Web服务返回一个对象,我想验证此对象的某个方法是否存在,因为它不会一直存在。

我发现this source似乎很有希望但是根据我的测试我可以看到结果总是消极的,而且当它明显存在时,方法永远找不到。

<cfif structKeyExists("#Result.getNotifications().getValidationResult(0)#","getField")>

Result是我的基础对象,我的最终目标是验证方法getField()是否存在。

enter image description here

与try / catch相比,有没有一种干净的方法呢?

4 个答案:

答案 0 :(得分:2)

<强>更新

不幸的是,我不确定IsInstanceOf()是否适用于Web服务,因为CF使用了一个Proxy对象来包装&#34;底层的Web服务类。如果没有,另一个简单的选择是检查类名。这避免了仅检查方法名称的模糊性(可能存在于许多不同的类中)。另外,我怀疑它可能比IsInstanceOf()更轻盈。

<cfif compare(yourObject.getClass().name, "org.tempuri.ValidationResultField") eq 0>
   Found ValidationResultField. do something
</cfif>

转储看起来像包含几种不同类型的对象/类:ArrayOfValidationResultValidationResultField,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 /