Исключения NullPointerException в ColdFusion 9 и ColdBox на локальном хосте

Я использую CF 9.0.1 Developer и Coldbox 3.0.0 на своем локальном компьютере (64-битная Windows Vista с 32-битным CF9 на Apache). Я работаю над приложением, которое я извлек из 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... кто-то, кто видел кучу похожих ошибок и думал, что это может быть ошибка CF9. Единственным ответом с любым видом решения был этот, предлагающий исправление, которое, похоже, было бы специфичным для передачи.

Кто-нибудь знает, что может быть причиной этих ошибок? Для меня не так важно их исправлять, как в производственном приложении, но если я рассылаю спам своими журналами с этими ошибками, трудно найти допустимые ошибки, когда они возникают.

Обновление: я работал с шаблоном CollectionPanel.cfm, чтобы определить основную причину, и здесь постоянно выдается исключение:

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

Я пытался обернуть cfdump в try-catch, но в любом случае выдается исключение, всегда из той же строки кода. Я думаю, это имеет смысл, учитывая, что эти ошибки не оказывают видимого влияния на страницы, на которых они возникают.

1 ответ

Кажется, это не вызвано <cfdump> вместо GetMetaData() вызов. В частности, когда вы получаете метаданные cfc, который расширяет другой cfc, который был изменен после того, как текущий был скомпилирован (и где GetMetaData был запущен), где он должен обновить структуру extends в возврате GetMetaData(). Cf генерирует структуру метаданных только один раз, скорее всего из соображений производительности.

Я думаю, что это может быть ошибка в CF...

Внутри TemplateProxyFactory.getTemplateFileHelper() он вызывает runtime.resolveTemplatePath(compName + ".cfc") где compName находится name.replace('.', '/')

Все хорошо и хорошо, пока вы не используете отображение. Если вы заменяете точки косыми чертами, вам нужно добавить начальную косую черту, как это делают в TemplateProxy.getMetaData()

Без начального слэша resolTemplatePath() возвращает значение null, которое запускает вызов VFSFileFactory.getFileObject(), который пытается получить объект File из родительского имени cfc.

Прежде чем он даже попадает в VFSFileFactory, он вызывает Util.getBaseTemplatePath() с pageContext. Внутри он получает ServletContext из pageContext и пытается вызвать getServletPath(), чтобы он мог получить свой реальный путь. Utils.getServletPath() пытается получить атрибут "javax.servlet.include.servlet_path", который на моей машине (и, вероятно, на вашей) не существует, и возвращает ноль.

Вы можете проверить, позвонив по этому: isNull(getPageContext().getRequest().getRequest().getAttribute("javax.servlet.include.servlet_path")); - да, там должно быть два вызова.getRequest().

Поэтому кажется, что Cf пытается обновить свою структуру extends в вызове cfc getMetaData() при изменении расширенного файла и делает это иначе, чем при первой генерации структуры.

У вас в админке, какие у вас настройки в Настройки сервера> Кэширование? Доверенный кеш? Шаблон кеша в запросе? Компонент кеша? Сохранить файлы классов? Кэшировать пути к веб-серверу?

Другие вопросы по тегам