Проблемы с областью применения для извлечения CFC

#coldfusion

#coldfusion

Вопрос:

Я пытаюсь связать CFC, но получаю сообщение об ошибке:

Вот моя конфигурация в моем приложении.cfc

 <cfset Application.relativePath = "/">
  <cfset Application.componentsPath = Replace(Application.relativePath,"/","",'All')>
  <cfset Application.cfcpath = Application.componentsPath amp; "com">
  <cfset Application.tools = '#Application.cfcpath#.tools'>
  

Теперь, когда я получаю доступ к cfc со своей страницы следующим образом:

 <cfset result = Application.cfcpath.tools.saveDrivers(form)>
  

Я получаю сообщение об ошибке:

 Element CFCPATH.TOOLS is undefined in a Java object of type class [Ljava.lang.String; referenced as '' 
  

если я попытаюсь

 <cfset result = Application.tools.saveDrivers(form)>
  

Я получаю сообщение об ошибке:

 The saveDrivers method was not found.
Either there are no methods with the specified method name and argument types or the saveDrivers method is overloaded with argument types that ColdFusion cannot decipher reliably. ColdFusion found 0 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity. 
  

Я сбросил область применения, и все кажется нормальным, но я не уверен, что здесь вызывает беспокойство

Ответ №1:

Оба Application.cfcpath и Application.tools являются просто строками, поэтому могут использоваться только как строки; тогда Application.cfcpath.tools как в инструкции:

 <cfset result = Application.cfcpath.tools.saveDrivers(form)>
  

является ссылкой на переменную. У вас не может быть строки, содержащей ссылку на переменную, и вы надеетесь, что каким-то образом ColdFusion волшебным образом приравняет их.

Из вашего вопроса неясно, пытаетесь ли вы создать объект с помощью своего оператора или просто ссылаетесь на существующий. Я подозреваю, что это первое. Я думаю, в этом случае вам нужны такие вещи:

 tools = createObject(Application.tools);
  

Комментарии:

1. Напечатал то же самое. Просто побей меня! Как сказал Адам, вы установили строки, а не объекты, и saveDrivers() для строки нет метода.

2. Я попробовал это, и это тоже сработало: <cfset this.mappings["/com"] = getDirectoryFromPath(getCurrentTemplatePath()) amp; "com/"> а затем сделал это так: <cfset Application.tools = new com.tools()>

3. Хорошо, итак, вы понимаете, как все это работает, и теперь вы разобрались со своей проблемой?