Почему CreateObject с точечным обозначением пути к компоненту не работает с использованием сопоставлений администратора CF, которые определяют путь к каталогу CFC?
Я работаю над веб-приложением, уже работающим на производственном сервере, на основе кода CF, который использует и зависит от сопоставлений администратора CF для определения местоположения CFC. У меня есть структура каталогов, как это:
Webroot/
_TaskDir/
Application.cfm
myFile.cfm
CFC/
component1.cfc
...
app/
Application.cfm
index.cfm
...
Мои сопоставления в CF Administrator имеют что-то вроде:
Logical Path: /myComponents
Directory Path: C:/Projects/Code/.../CFC/
Большая часть приложения находится в каталоге приложения и использует вызовы для создания объектов повсюду, например:<cfset myCFCojb = CreateObject("component", "myComponents.component1").init()>
В другой папке в webroot есть несколько сценариев типа запланированных задач (_TaskDir
) который вызывает CreateObject
метод так же, как и везде, используя точечную запись, чтобы указать путь к каталогу сопоставленных компонентов. Предположительно, он работал нормально на производстве, но по какой-то неизвестной причине я обнаружил, что он не работает в этом каталоге в моей среде разработки. CreateObject
отлично работает в остальной части моего приложения, но когда помещается в скрипты в этой папке, это не получается.
Под неудачей я имею в виду NullPointerException
ошибка. Если я изменяю путь точечной нотации на физический путь (так как оба пути находятся в корне), такой как CreateObject("component", "/CFC/component1").init()
тогда все нормально. Это просто точечные обозначения и отображения, которые, кажется, игнорируются только в этом каталоге.
Это потому, что эта папка находится вне каталога приложения, в котором Application.cfm
и это _TaskDir
имеет свой Application.cfm
? Я думаю, что сопоставления будут работать для обоих.
Первая часть stackTrace:
java.lang.NullPointerException в coldfusion.util.Utils.getDirectoryFromPath(Utils.java:350) в coldfusion.runtime.TemplateProxyFactory.getTemplateFileHelper(TemplateProxyFactory.java:1638) в coldfusion.cfc.ComponentProxy в coldfusion.runtime.CFPage.CreateObject(CFPage.java:6354) в coldfusion.runtime.CFPage.CreateObject(CFPage.java:6373)...
Я использую CF2016 в контейнере Tomcat.
1 ответ
Я нашел проблему. Выяснилось, что версия Tomcat (8.5.20), которую я использую в качестве контейнера для моего сервера Apache, теперь чувствительна к регистру. Я запустил 3 скрипта из своего каталога _TaskDir, указав URL с неправильным регистром (_Taskdir), первые 2 запустились нормально. Третий был тот, который пытался запустить CreateObject, используя сопоставления администратора, чтобы найти каталог CFC. URL, по-видимому, используется для сравнения с путями Mappings. Использование неправильного регистра в URL влияет на путь точечного обозначения к каталогу CFC. По крайней мере, я знаю, как решить это сейчас.
Если вы можете пролить больше света на то, как эти регистрозависимые пути влияют на CF, я бы хотел узнать больше. Если есть статья на эту тему, пожалуйста, поделитесь.