【发布时间】:2018-12-21 14:45:49
【问题描述】:
我在我的 ColdFusion 应用程序中广泛使用组件,并且经常遇到我的组件未定义的错误,尽管它们确实已定义。
我在我的 Application.cfc 文件中定义组件。
<cfset cfcList = "component1,component2,component3">
<cfloop list="#cfcList#" index="local.thisCfcName">
<cfset application.cfc[local.thisCfcName] = createObject(
"component",
"#application.cfcPath##local.thisCfcName#"
)>
</cfloop>
我已经能够确定:在我的 onRequestStart 函数中,我在遇到“init”url 变量时重新启动应用程序:
<cfif structKeyExists(url, "init")>
<cfset onApplicationStart()>
</cfif>
似乎在应用程序重新初始化时,任何其他尝试访问该组件的用户都会收到以下错误(失败的组件可能会有所不同)。
[diag]=元素 CFC.COMPONENT1 在类 [Ljava.lang.String; 类型的 Java 对象中未定义;引用为 ''
我在这里做错了什么可以解决这个问题吗?我每天都会遇到几次这些错误,并且必须有解决方案,但我无法找到有关此特定问题的任何信息。
【问题讨论】:
-
你为什么要频繁重启应用程序?
-
这可能不是你想要的。您可能想要
onSessionStart或onRequestStart。如果您对应用程序进行频繁的代码更改,因此这是一个问题,您还应该重新考虑您的代码交付管道 -
"我见过的每个示例应用程序都这样做。"出于好奇,您在哪里看到这些示例?它们真的被用于你认为它们被使用的东西吗?频繁的应用程序开始接收新代码,听起来您要么过于频繁地部署到生产环境,要么是
在生产环境中开发 !>。 -
我从未见过 cf 应用程序在每次用户执行某项操作时都会刷新它的缓存组件。我见过很多网站通过在 onRequestStart() 中调用 onApplicationStart() 来允许某种形式的应用程序刷新,但它通常很少由管理员/开发人员触发。为什么生产环境中的代码更改如此频繁,以至于您让普通用户触发应用刷新?
-
您应该注意的另一个问题是,如果我自动调用大量
https://yourwebsite.com?init,那么我可以轻松地 DOS 您的站点。我建议,如果您需要该功能,可以进行一些严格的速率限制检查,甚至更好的方法只允许管理员用户使用它。
标签: coldfusion components