2011-04-18 32 views
1

我在本地機器上運行CF 9.0.1 Developer和Coldbox 3.0.0(在Apache上運行32位CF9的64位Windows Vista)。我正在研究一個從SVN簽出並在本地部署的應用程序。似乎一切都正常工作,但我的應用程序日誌中的條目填充像這樣:ColdFusion 9中的NullPointerExceptions和localhost上的ColdBox

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轉移開發組中的this thread ......看到一堆類似錯誤和想法的人可能是CF9的一個bug。唯一的解決方案是this one,這表明修復似乎是特定於Transfer的。

有誰知道什麼可能會導致這些錯誤?對我來說修復它們不像生產應用程序那樣重要,但如果我用這些錯誤發送垃圾郵件,那麼很難在發生錯誤時發現合法錯誤。

更新:我一直在工作與CollectionPanel.cfm模板來確定根本原因,異常始終拋出這裏:

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

我試過一試包裹cfdump -catch,但總是從同一行代碼中拋出異常。我猜這是有道理的,因爲這些錯誤對它們發生的頁面沒有任何明顯的影響。

+0

戴夫,如果這是你仍然可以有更好的運氣張貼到冷箱谷歌集團的問題:https://groups.google.com/forum/#!forum/coldbox – 2011-08-06 18:15:31

+0

謝謝你,艾倫。是的,它仍在發生。還有另外一個我偶爾注意到的問題,但也僅限於本地實例,並且也僅在調試模式打開時纔有可能與此相關。我會看看我是否可以收集更多具體信息,並以我發現的內容發佈到小組。 – 2011-08-07 02:59:12

回答

0

它似乎不是從<cfdump>而是從GetMetaData()呼叫引起的。 特別是當你得到一個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()調用在那裏。

如此看來比照試圖刷新很CFC的getMetaData延伸結構()調用時,擴展文件被修改,並做它用不同的方式,然後當它第一次產生的結構。

在您比照管理員,你是什麼服務器設置在設置>緩存? 可信緩存?在請求中緩存模板?組件緩存?保存類文件?緩存Web服務器路徑?

+0

默認值,我相信:信任的高速緩存是假的,請求緩存模板是真實的,部分緩存是真實的,保存類文件是真實的,高速緩存Web服務器的路徑是錯誤的。 – 2012-03-07 14:42:56