ColdFusion 11 似乎呈现 superclass 和 class 的定义

ColdFusion 11 seems to render definitions for superclass as well as class

在 ColdFusion 应用程序中,我有一个名为 ProjectBeanService 的 class 扩展了另一个名为 AjaxBeanService 的 class。

在 CF8 中,代码似乎可以正常工作,当在 IE 中调试应用程序时,我看到了这样的渲染 JavaScript:

<script type="text/javascript">
    var _cf_ProjectBeanService=ColdFusion.AjaxProxy.init('/components/ProjectBeanService.cfc','ProjectBeanService');
    _cf_ProjectBeanService.prototype.get=function(sPropertyName,sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "get", {sPropertyName:sPropertyName,sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
    _cf_ProjectBeanService.prototype.getAll=function(sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "getAll", {sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
    _cf_ProjectBeanService.prototype.set=function(sPropertyName,oPropertyValue,sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "set", {sPropertyName:sPropertyName,oPropertyValue:oPropertyValue,sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
</script>

但是,当我尝试在 CF11 下 运行 相同的应用程序时,class 方法和 superclass 方法都被渲染:

<script type="text/javascript">/* <![CDATA[ */
    var _cf_ProjectBeanService=ColdFusion.AjaxProxy.init('/components/ProjectBeanService.cfc','ProjectBeanService');
    _cf_ProjectBeanService.prototype.get=function(sPropertyName,sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "get","4789898A8974AC60", {sPropertyName:sPropertyName,sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
    _cf_ProjectBeanService.prototype.getAll=function(sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "getAll","4789898A8974AC60", {sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
    _cf_ProjectBeanService.prototype.set=function(sPropertyName,oPropertyValue,sBeanType,nID,sSection,nRevision) { return ColdFusion.AjaxProxy.invoke(this, "set","4789898A8974AC60", {sPropertyName:sPropertyName,oPropertyValue:oPropertyValue,sBeanType:sBeanType,nID:nID,sSection:sSection,nRevision:nRevision});};
    _cf_ProjectBeanService.prototype.get=function(sBeanName,sPropertyName) { return ColdFusion.AjaxProxy.invoke(this, "get","4789898A8974AC60", {sBeanName:sBeanName,sPropertyName:sPropertyName});};
    _cf_ProjectBeanService.prototype.destroySessionBean=function(sBeanName) { return ColdFusion.AjaxProxy.invoke(this, "destroySessionBean","4789898A8974AC60", {sBeanName:sBeanName});};
    _cf_ProjectBeanService.prototype.createSessionBean=function(sBeanName,sBeanType,sDAOName) { return ColdFusion.AjaxProxy.invoke(this, "createSessionBean","4789898A8974AC60", {sBeanName:sBeanName,sBeanType:sBeanType,sDAOName:sDAOName});};
    _cf_ProjectBeanService.prototype.getAll=function(sBeanName) { return ColdFusion.AjaxProxy.invoke(this, "getAll","4789898A8974AC60", {sBeanName:sBeanName});};
    _cf_ProjectBeanService.prototype.getSessionBean=function(sBeanName) { return ColdFusion.AjaxProxy.invoke(this, "getSessionBean","4789898A8974AC60", {sBeanName:sBeanName});};
    _cf_ProjectBeanService.prototype.set=function(sBeanName,sPropertyName,oPropertyValue) { return ColdFusion.AjaxProxy.invoke(this, "set","4789898A8974AC60", {sBeanName:sBeanName,sPropertyName:sPropertyName,oPropertyValue:oPropertyValue});};
    _cf_ProjectBeanService.prototype.reInitSessionBean=function(sBeanName,argument1,argument2,argument3,argument4) { return ColdFusion.AjaxProxy.invoke(this, "reInitSessionBean","4789898A8974AC60", {sBeanName:sBeanName,argument1:argument1,argument2:argument2,argument3:argument3,argument4:argument4});};
/* ]]> */</script>

在这段代码中,注意在定义了"set"函数之后,它是如何被再次定义的(并且根据superclass的定义)。在我看来,ColdFusion 11 正在渲染这个超级class,而 CF 8 没有。

有什么建议吗?

更新:

这是应用程序的精简版,我能够在其中重现错误。

/components/AbstractAjax.cfc:

<cfcomponent displayname="AbstractAjax">

    <cffunction name="sendError" access="private" returntype="void">
        <cfargument name="sErrCode" type="string" required="yes" />
        <cfargument name="sErrMsg" type="string" required="yes" />      
        <cfif IsNumeric(arguments.sErrCode)>
            <cfscript>
                GetPageContext().getResponse().sendError(arguments.sErrCode,arguments.sErrMsg);
         </cfscript>
      <cfelse>
        <cfscript>
            GetPageContext().getResponse().sendError(555,arguments.sErrCode & ' - ' & arguments.sErrMsg);
         </cfscript>
      </cfif>
    </cffunction>

</cfcomponent>

/components/AjaxBeanService.cfc:

<cfcomponent displayname="AjaxBeanService" extends="com.AbstractAjax">

    <cffunction name="createSessionBean" access="remote" returntype="struct">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfargument name="sBeanType" type="string" required="yes">
        <cfargument name="sDAOName" type="string" required="yes">
        <cfset var oBean = StructNew() />
        <cfset var oBeanArguments = ARGUMENTS />
        <cfset var oDAO = application[sDAOName] />

        <cftry>
            <cfset oBean = createObject("component","com." & sBeanType) />

             <!--- delete first 3 elements from arguments array --->
            <cfset ArrayDeleteAt(oBeanArguments,1) />
            <cfset ArrayDeleteAt(oBeanArguments,1) />
            <cfset ArrayDeleteAt(oBeanArguments,1) />

            <!--- make the DAO object the first argument --->
            <cfset ArrayPrepend(oBeanArguments,oDAO) />

            <cfset oBean.init.apply(oBean,oBeanArguments) />
            <cfset SESSION.beans[sBeanName] = oBean />
            <cfreturn oBean.getAll() />
            <cfcatch type="any">
                <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
    </cffunction>

    <cffunction name="destroySessionBean" access="remote" returntype="struct">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfset rc = StructDelete(SESSION.beans, "#sBeanName#", "True")>
    </cffunction>

    <cffunction name="reInitSessionBean" access="remote" returntype="struct">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfargument name="argument1" type="any" required="no" default="">
        <cfargument name="argument2" type="any" required="no" default="">
        <cfargument name="argument3" type="any" required="no" default="">
        <cfargument name="argument4" type="any" required="no" default="">
       <cfset var oBean = StructNew() />
        <cftry>
            <cfset oBean = getSessionBean(sBeanName) />           
            <cfset oBean.init(oBean.getDAO(),argument1,argument2,argument3,argument4) />
            <cfset SESSION.beans[sBeanName] = oBean />
            <cfreturn oBean.getAll() />
            <cfcatch type="any">
                <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
    </cffunction>

    <cffunction name="getSessionBean" access="remote" returntype="any">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfset var oBean = StructNew() />
        <cfif StructKeyExists(SESSION.beans,sBeanName) >
            <cflock scope="session" type="readonly" timeout="5" throwontimeout="yes">
                <cfset oBean = Duplicate(SESSION.beans[sBeanName]) />
            </cflock>
        </cfif>
        <cfif StructIsEmpty(oBean)>
            <cfthrow errorcode="500" message="No bean found by the name '#sBeanname#'" />
        <cfelse>
            <cfreturn oBean />
        </cfif>
    </cffunction>

    <cffunction name="set" access="remote" returntype="void">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfargument name="sPropertyName" type="string" required="yes">
        <cfargument name="oPropertyValue" type="string" required="yes">
        <cfset var oBean = StructNew() />
        <cftry>
            <cfset oBean = getSessionBean(sBeanName) />
            <cfset oBean.set(sPropertyName,oPropertyValue) />
            <cfcatch type="any">
                 <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

    <cffunction name="get" access="remote" returntype="any">
        <cfargument name="sBeanName" type="string" required="yes">
        <cfargument name="sPropertyName" type="string" required="yes">

        <cfset var value = "" />
        <cfset var oBean = StructNew() />

        <cftry>      
            <cfset oBean = getSessionBean(sBeanName) />
            <cfset value = oBean.get(sPropertyName) />
            <cfreturn value />

            <cfcatch type="any">
                    <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

     <cffunction name="getAll" access="remote" returntype="struct">
        <cfargument name="sBeanName" type="string" required="yes">

        <cfset var oBean = StructNew() />
        <cfset var oStruct = structNew() />

        <cftry>      
            <cfset oBean = getSessionBean(sBeanName) />
            <cfset oStruct = oBean.getAll() />
            <cfreturn oStruct />

            <cfcatch type="any">
                  <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

</cfcomponent>

/components/ProjectBeanService.cfc:

<cfcomponent displayname="ProjectBeanService" extends="com.AjaxBeanService">

    <cffunction name="getBean" access="private" returntype="any">
        <cfargument name="sBeanType" type="string" required="yes">
        <cfargument name="nID" type="numeric" required="yes" hint="ProjectID or ImpactID">
        <cfargument name="sSection" type="string" required="no" hint="ProjectSection or ImpactSection" default="">
        <cfargument name="nRevision" type="numeric" required="no" hint="Commitment Revision" default="0">

        <cfset var oBean = createObject("component","com." & sBeanType).init(nID,sSection,nRevision)  />

        <cfreturn oBean />

    </cffunction>

    <cffunction name="set" access="remote" returntype="void">
        <cfargument name="sPropertyName" type="string" required="yes">
        <cfargument name="oPropertyValue" type="string" required="yes">
        <cfargument name="sBeanType" type="string" required="yes">
        <cfargument name="nID" type="numeric" required="yes">
        <cfargument name="sSection" type="string" required="no" default="">
        <cfargument name="nRevision" type="numeric" required="no" default="0">
        <cfset var oBean = StructNew() />
        <cftry>

            <cfset oBean = getBean(sBeanType, nID, sSection,nRevision) />
            <cfset oBean.set(sPropertyName,oPropertyValue) />
            <cfcatch type="any">
                 <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

    <cffunction name="get" access="remote" returntype="any">
        <cfargument name="sPropertyName" type="string" required="yes">
        <cfargument name="sBeanType" type="string" required="yes">
        <cfargument name="nID" type="numeric" required="yes">
        <cfargument name="sSection" type="string" required="no" default="">
        <cfargument name="nRevision" type="numeric" required="no" default="0">

        <cfset var value = "" />
        <cfset var oBean = StructNew() />

        <cftry>      
            <cfset oBean = getBean(sBeanType,nID,sSection,nRevision) />
            <cfset value = oBean.get(sPropertyName) />
            <cfreturn value />

            <cfcatch type="any">
                    <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

     <cffunction name="getAll" access="remote" returntype="struct">
        <cfargument name="sBeanType" type="string" required="no" default="ProjectBean">
        <cfargument name="nID" type="numeric" required="yes">
        <cfargument name="sSection" type="string" required="no" default="">
        <cfargument name="nRevision" type="numeric" required="no" default="0">

        <cfset var oBean = StructNew() />
        <cfset var oStruct = structNew() />

        <cftry>      
            <cfset oBean = getBean(sBeanType,nID,sSection,nRevision) />
            <cfset oStruct = oBean.getAll() />
            <cfreturn oStruct />

            <cfcatch type="any">
                  <cfset sendError(cfcatch.ErrorCode,cfcatch.message) />
            </cfcatch>
        </cftry>
     </cffunction>

</cfcomponent>

/Application.cfc:

<cfcomponent>
    <cfscript>
        this.mappings["/com"] = getDirectoryFromPath(getCurrentTemplatePath()) & "\components\";    
   </cfscript> 
</cfcomponent>

/index.cfm:

<html>
<head>
<title></title>    
   <cfajaxproxy cfc="com.ProjectBeanService" jsclassname="ProjectBeanService">   
</head>
<body>
<span>This is a test.</span>
</body>
</html>

到目前为止,我得出的唯一答案是这一定是 CF11 中的错误,因此我能够通过将父 class 中的方法标记为 "fix" 它可以访问 "public" 而不是 "remote"。我还不知道这会产生什么意想不到的后果,但它似乎已经解决了我的问题。如果谁有更好的建议,请告诉我,我会把答案检查给那个人。