Исключения 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() при изменении расширенного файла и делает это иначе, чем при первой генерации структуры.
У вас в админке, какие у вас настройки в Настройки сервера> Кэширование? Доверенный кеш? Шаблон кеша в запросе? Компонент кеша? Сохранить файлы классов? Кэшировать пути к веб-серверу?