Почему 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, я бы хотел узнать больше. Если есть статья на эту тему, пожалуйста, поделитесь.

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