我在本地计算机上运行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中,但无论如何都会抛出异常,总是来自同一行代码。我认为这是有道理的,因为这些错误对它们出现的页面没有任何明显的影响。
答案 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服务器路径?