我在将一些文件部署到ColdFusion网站/应用程序后,今天早上遇到了一个问题。
我使用一些新代码更新了现有的CFC。 CFC有一个init()方法,它返回实例化的Object:
原始MyObject.cfc:
<cfscript>
VARIABLES.MyParam = "";
</cfscript>
<cffunction name="init" returntype="MyObject" output="false">
<cfargument name="MyParam" type="String" required="true" />
<cfscript>
VARIABLES.MyParam = ARGUMENTS.MyParam;
return THIS;
</cfscript>
</cffunction>
新的MyObject.cfc:
<cfscript>
VARIABLES.MyParam = "";
</cfscript>
<cffunction name="init" returntype="MyObject" output="false">
<cfargument name="MyParam" type="String" required="true" />
<cfscript>
setMyParam(ARGUMENTS.MyParam);
return THIS;
</cfscript>
</cffunction>
<cffunction name="setMyParam" output="false" returntype="Void">
<cfargument name="MyParam" type="String" required="true" />
<cfset VARIABLES.MyParam = Trim(ARGUMENTS.MyParam) />
</cffunction>
<cffunction name="getMyParam" output="false" returntype="String">
<cfreturn VARIABLES.MyParam />
</cffunction>
任何时候扩展这个CFC的Object都称为init(),它抛出异常:
“从init函数返回的值不是MyObject类型。”
在部署此更改的任何其他环境中都不会发生此问题 - 仅在生产中。
解决这个问题的唯一方法是清除ColdFusion Administrator中的模板缓存。
所以,我正在寻找一种方法来防止将来发生这种情况和/或在部署文件时自动清除模板缓存的方法。
仅供参考,我目前使用Tortoise SVN部署文件。
答案 0 :(得分:3)
在init()中(或者更优选地,在另一个重载样式方法中),以编程方式调用Admin API的clearTrustedCache()方法:
<cfscript>
// Login is always required (if the administrator password
// is enabled in the ColdFusion Administrator).
// This example uses two lines of code.
adminObj = createObject("component","cfide.adminapi.administrator");
adminObj.login("admin");
// Instantiate the runtime object.
myObj = createObject("component","cfide.adminapi.runtime");
// clear cache
myObj.clearTrustedCache();
// Stop and restart trusted cache. However, only the clearTrustedCache function needs to be called.
myObj.setCacheProperty("TrustedCache", 0);
myObj.setCacheProperty("TrustedCache", 1);
</cfscript>
此功能早在CF7(Source)就位。请注意,您需要CF管理员密码。
如果您在管理员中启用了该选项,我还建议您清除组件缓存:
myObj.clearComponentCache();