本地主机上 ColdFusion 9 和 ColdBox 中的 NullPointerExceptions
Posted
技术标签:
【中文标题】本地主机上 ColdFusion 9 和 ColdBox 中的 NullPointerExceptions【英文标题】:NullPointerExceptions in ColdFusion 9 and ColdBox on localhost 【发布时间】:2011-08-08 01:48:29 【问题描述】:我在本地计算机上运行 CF 9.0.1 Developer 和 Coldbox 3.0.0(在 Apache 上运行 32 位 CF9 的 64 位 Windows Vista)。我正在开发一个从 SVN 签出并在本地部署的应用程序。一切似乎都正常工作,但我的应用程序日志中充满了这样的条目:
Apr 18, 2011 12:41 PM Error jrpp-7
exception.log 对每个异常都有一个非常长的堆栈跟踪,可能有 150 行左右。开头是这样的:
"Error","jrpp-4","04/18/11","11:07:30",,""
java.lang.NullPointerException
at coldfusion.util.Utils.getServletPath(Utils.java:86)
at coldfusion.util.Utils.getServletPath(Utils.java:76)
at coldfusion.util.Utils.getBaseTemplatePath(Utils.java:405)
at coldfusion.runtime.TemplateProxyFactory.getTemplateFileHelper
(TemplateProxyFactory.java:1522)
at coldfusion.runtime.MetadataUtils.getComponentMetadata
(MetadataUtils.java:112)
at coldfusion.runtime.CfJspPage.GetComponentMetaData(CfJspPage.java:2667)
at coldfusion.runtime.TemplateProxy.getRuntimeComponentMetadata
(TemplateProxy.java:1756)
at coldfusion.runtime.TemplateProxy.getRuntimeMetadata
(TemplateProxy.java:1617)
at coldfusion.runtime.MetadataUtils.getMetaData(MetadataUtils.java:54)
at coldfusion.runtime.CfJspPage.GetMetaData(CfJspPage.java:2640)
at cfEventHandler2ecfc862260423$funcPOSTLOAD.runFunction
(C:\ColdFusion9\wwwroot\ybocv5\coldbox\system\orm\hibernate
\EventHandler.cfc:30)
这是一个已经在生产中运行的应用版本,让我觉得这只是在我的本地版本上的原因是它在堆栈跟踪中的外观:
at cfdump2ecfm471394032$funcRENDEROUTPUT.runFunction
(E:\cf9_updates_rc\cfusion\wwwroot\WEB-INF\cftags\dump.cfm:704)
...
at cfCollectionPanel2ecfm961210602.runPage
(C:\ColdFusion9\wwwroot\ybocv5\coldbox\system\includes
\panels\CollectionPanel.cfm:40)
我们不在生产环境中使用 cfdump;这看起来像是 ColdBox 试图在调试器面板中显示一个复杂的对象并失败了。
到目前为止,我在网上找到的唯一内容是 Google 的 transfer-dev 组中的 this thread ......有人看到一堆类似的错误并认为可能是 CF9 错误。任何解决方案的唯一回复是this one,建议修复似乎是特定于传输的。
有谁知道可能导致这些错误的原因?修复它们对我来说并不像在生产应用程序上那样重要,但如果我用这些错误向我的日志发送垃圾邮件,那么当它们发生时很难找到合法的错误。
更新:我一直在使用 CollectionPanel.cfm 模板来确定根本原因,并且始终在此处抛出异常:
<cfelseif isObject(varVal)>
<!--- this cfdump is the guilty party ... --->
<cfdump var="#varVal#" expand="false" top="2">
<cfelse>
我尝试将cfdump
包装在try-catch 中,但无论如何都会抛出异常,总是来自同一行代码。我想这是有道理的,因为这些错误对它们发生的页面没有任何明显的影响。
【问题讨论】:
戴夫,如果这仍然是一个问题,您可能会更幸运地发帖到 ColdBox Google 群组:groups.google.com/forum/#!forum/coldbox 谢谢,亚伦。是的,它仍在发生;还有一个我偶尔注意到的问题,但也只在我的本地实例上,也只有在调试模式打开时,所以这可能与这个问题有关。我会看看我是否可以收集更多具体信息并将我发现的内容发布到小组。 【参考方案1】:这似乎不是由<cfdump>
引起的,而是由GetMetaData()
调用引起的。
特别是当您获取 cfc 的元数据时,该 cfc 扩展了另一个 cfc,该 cfc 在当前已编译(以及运行 GetMetaData 的位置)后需要更新 GetMetaData() 返回中的扩展结构。 Cf 只生成一次元数据结构,很可能是出于性能原因。
我认为这可能是 cf 中的一个错误...
在 TemplateProxyFactory.getTemplateFileHelper() 内部,它调用 runtime.resolveTemplatePath(compName + ".cfc")
,其中 compName 是 name.replace('.', '/')
一切顺利,直到您使用映射。如果直接用斜线替换点,则需要添加前导斜线,就像在 TemplateProxy.getMetaData() 中所做的那样
如果没有前导斜杠,resolveTemplatePath() 返回 null,这会触发 VFSFileFactory.getFileObject() 调用,该调用尝试从父 cfc 名称获取 File 对象。
在它到达 VFSFileFactory 之前,它使用 pageContext 调用 Util.getBaseTemplatePath()。在它内部,它从 pageContext 获取 ServletContext 并尝试调用 getServletPath() 以便它可以获取其真实路径。 Utils.getServletPath() 尝试获取属性“javax.servlet.include.servlet_path”,该属性在我的机器(也可能是你的机器)上不存在并返回 null。
你可以通过调用这个来检查:isNull(getPageContext().getRequest().getRequest().getAttribute("javax.servlet.include.servlet_path"));
- 是的,那里应该有两个 .getRequest() 调用。
因此,当扩展文件被修改时,Cf 似乎试图在 cfc getMetaData() 调用中刷新它的扩展结构,并以与第一次生成结构时不同的方式进行。
在您的 cf admin 中,您在服务器设置 > 缓存下进行了哪些设置? 可信缓存?在请求中缓存模板?组件缓存?保存类文件?缓存网络服务器路径?
【讨论】:
默认值,我相信:可信缓存为假,请求中的缓存模板为真,组件缓存为真,保存类文件为真,缓存Web服务器路径为假。以上是关于本地主机上 ColdFusion 9 和 ColdBox 中的 NullPointerExceptions的主要内容,如果未能解决你的问题,请参考以下文章
本地主机上 Smack 和 Openfire 之间的路由错误