ColdFusion 9中的NullPointerExceptions和localhost上的ColdBox

时间:2011-04-18 17:32:58

标签: coldfusion coldfusion-9 coldbox

我在本地计算机上运行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试图在调试器面板中显示一个复杂的对象并失败。

到目前为止,我在网上找到的唯一一件事就是在谷歌的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中,但无论如何都会抛出异常,总是来自同一行代码。我认为这是有道理的,因为这些错误对它们出现的页面没有任何明显的影响。

1 个答案:

答案 0 :(得分:0)

它似乎不是来自<cfdump>来自GetMetaData()来电。 特别是当您获得cfc的元数据时,它会扩展另一个cfc,该cfc在编译当前(以及运行GetMetaData)之后已被修改,它需要更新GetMetaData()返回中的extends结构。 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中,你在服务器设置&gt;下的设置是什么?缓存? 可信缓存?请求中的缓存模板?组件缓存?保存类文件?缓存Web服务器路径?