1

我在本地机器上运行 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 组中的这个线程……有人看到一堆类似的错误,并认为这可能是一个 CF9 错误。任何类型的解决方案的唯一回复是这个,建议一个似乎是特定于传输的修复。

有谁知道可能导致这些错误的原因?修复它们对我来说并不像在生产应用程序上那样重要,但是如果我用这些错误向我的日志发送垃圾邮件,那么当它们发生时很难找到合法的错误。

更新:我一直在使用 CollectionPanel.cfm 模板来确定根本原因,并且始终在此处抛出异常:

    <cfelseif isObject(varVal)>
        <!--- this cfdump is the guilty party ... --->
        <cfdump var="#varVal#" expand="false" top="2">
    <cfelse>

我尝试将其包装cfdump在 try-catch 中,但无论如何都会抛出异常,总是来自同一行代码。我想这是有道理的,因为这些错误对它们发生的页面没有任何明显的影响。

4

1 回答 1

0

它似乎不是由呼叫引起的,<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中,您在服务器设置>缓存下进行了哪些设置?可信缓存?在请求中缓存模板?组件缓存?保存类文件?缓存网络服务器路径?

于 2011-11-22T05:38:46.123 回答