2

问题:在为CFC请求WSDL时,我收到以下错误:Variable FORM is undefined。它发生在这行代码中,在 application.cfc 的 OnRequestStart 方法中

<cfif structKeyExists(form,'resetappvars')>
    <cfset OnApplicationStart() />
</cfif>

如果我请求特定的方法,它可以正常工作。如果不存在,我曾考虑使用 cfparam 创建默认表单结构,但这似乎是一个丑陋的 hack,我担心它实际上会在 CFC 的变量或此范围内创建表单结构。也许这也是一个合法的错误?

注意:这仅在我请求 WSDL 时发生,如果我直接调用一个方法 - 代码按预期执行而没有问题。

更新: Application.cfc 代码示例 - 只需将任何 CFC 添加到您的应用程序并请求它?wsdl以查看问题。这已经在 ColdFusion 7 和 ColdFusion 8 上进行了测试(但失败了)。

<cfcomponent output="false">

    <cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
        <cfset application.dsn = "my_dsn" />
        <cfreturn true />
    </cffunction>

    <cffunction name="OnRequestStart" access="public" returntype="boolean" output="false" hint="Fires at first part of page processing.">
        <cfargument name="TargetPage" type="string" required="true" />
        <cfif structKeyExists(form,'resetappvars')>
            <cfset OnApplicationStart() />
        </cfif>
        <cfreturn true />
    </cffunction>
</cfcomponent>
4

5 回答 5

8

也许尝试添加:

 <cfif IsDefined("form")>...</cfif>

围绕上面的代码?

于 2009-07-30T13:45:25.993 回答
4

您也可以cfparam使用您正在寻找的变量,然后稍微更改您的逻辑(假设 resetAppVars 是一个布尔值:

<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
  <cfset OnApplicationStart() />
</cfif>

编辑:我不确定上面的代码是否可以被认为是 hack,但对我来说,它似乎很标准 CF。

于 2009-07-30T13:53:11.460 回答
3

Ben Nadel 的这篇文章详细列出了适用于不同类型请求的范围。

通过阅读它,您可以轻松地发现表单范围在给定的上下文中不可用,但url是。

于 2010-01-05T09:42:56.447 回答
2

我听说这只是一个意见问题,但在我看来,在 CFC 中引用您的表单范围是不合适的,因为不能保证当您的 cfc 被调用和您的方法时表单范围可用叫做。最好确保将任何需要可用于该方法的数据明确地提供给您的对象。这可以通过包含一个参数来完成:

<cfargument name="resetAppVars" type="boolean" required="false" default="false" />

然后检查arguments.resetAppVars,它总是被定义,但默认为false。

或者通过在对象上创建属性并创建显式 set 方法:

(在您的 cfc 顶部)

<cfset this.resetAppVars = false />


<cffunction name="setResetAppVars" access="public" returnType="void" output="false">
   <cfargument name="flagValue" type="boolean" required="true" />

   <cfset this.resetAppVars = arguments.flagValue />
</cffunction>

在这种情况下,您将检查 this.resetAppVars。您还可以将<cfset var resetAppVars = false />其用作声明的本地范围,这使其成为对象的私有属性,并且可能是正确的,因此调用对象的代码不能不正确地用非布尔类型覆盖此变量。在这种情况下,您只需在测试中直接引用 resetAppvars,而不是使用此范围。

于 2009-07-31T21:49:32.813 回答
1

你也可以这样做:

<cfif NOT isSoapRequest()>...

并将您剩余的逻辑粘贴在该块中。

于 2010-01-05T10:13:30.460 回答