Двойное создание одного CFC

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

<!--- one.cfc --->
<cfcomponent name="FirstCFC">
   <cfset this.Tools = createObject('component', 'toolbox').init()>
....
</cfcomponent>

<!--- two.cfc --->
<cfcomponent name="SecondFC">
   <cfset this.Tools = createObject('component', 'toolbox').init()>
....
</cfcomponent>

<!--- toolbox.cfc --->
<cfcomponent name="Toolbox">
   <cffunction name="init" access="public">
      <cfreturn this>
   </cffunction>

   <cffunction name="someFunc" access="public">
   </cffunction>
</cfcomponent>

Вот скриншот ошибки 500

введите здесь описание изображения

Вот более «полный» пример кода

http://pastebin.com/zJ1zpHYy


person RHPT    schedule 22.04.2012    source источник
comment
Ошибка 500 обычно указывает на проблему с конфигурацией вашего веб-сервера. Я не вижу ничего плохого в вашем коде.   -  person Sean Walsh    schedule 22.04.2012
comment
Предполагая, что все три CFC находятся в одной папке   -  person Jason Dean    schedule 22.04.2012
comment
Сообщение об ошибке 500, вероятно, также говорит о включении надежной обработки исключений, чтобы увидеть лучшую ошибку (или что-то в этом роде). Сделайте это, чтобы получить правильное сообщение об ошибке. Или, возможно, переключение дружественных сообщений об ошибках, если вы используете IE. Вероятно, это сделает более очевидным, в чем ваша проблема.   -  person Adam Cameron    schedule 22.04.2012
comment
У меня нет доступа к серверу, так как это работа для третьей стороны. И ошибка исчезнет, ​​если я уберу дубликат экземпляра.   -  person RHPT    schedule 22.04.2012
comment
Компоненты находятся в отдельных файлах? Они должны быть такими, если они не помещены в отдельные файлы, названные в честь имени компонента, за которым следует .cfc. Имя, по-видимому, не является допустимым атрибутом, так как имя компонента на самом деле берется из имени файла cfc, поэтому попробуйте удалить и его. Если проблема все еще остается, попробуйте закомментировать весь код, не относящийся к инициализации, и посмотреть, исчезнет ли проблема.   -  person Dan Roberts    schedule 22.04.2012
comment
Да, компоненты находятся в отдельных файлах. Я только что попытался закомментировать весь код, не относящийся к инициализации, и проблема все еще существует.   -  person RHPT    schedule 23.04.2012
comment
Измените два CFSET «this.Tools» на «variables.Tools», убедитесь, что ваш каталог cfclasses пуст, перезапустите CF и повторите проверку. Область «ЭТО» неявно является общедоступной областью (в отличие от Java), и у меня есть ощущение, что в зависимости от того, как вы создаете экземпляры FirstCFC и SecondCFC, две ссылки «ЭТО» перезаписывают друг друга в своих псевдоконструкторах.   -  person Shawn Holmes    schedule 23.04.2012
comment
У меня также есть подозрение, что происходит некоторая рекурсия как часть методов, не отображаемых в OP...   -  person Shawn Holmes    schedule 23.04.2012
comment
@ShawnHolmes Вы правы. Я не понимал этого до вашего комментария. Toolbox.cfc создает экземпляр SecondCFC, а затем я создаю экземпляр secondCFC из Toolbox.   -  person RHPT    schedule 23.04.2012
comment
Я понял, как много. Я добавил ответ для полноты, основанный на вашем ответе.   -  person Shawn Holmes    schedule 23.04.2012
comment
Вы не сказали, как возникает ошибка. Вы показали код для 3 CFC, но ничего о том, как вы использовали CFC. Не могли бы вы показать файл (или его часть), который использует один из этих CFC и создает ошибку 500?   -  person Raymond Camden    schedule 23.04.2012
comment
Мой первый проход предполагал, что рекурсия произошла на основе создания A, частного B, и B имел ссылку на A через ЭТО, а не ПЕРЕМЕННЫЕ. Я обновил свой ответ, который является более прямолинейным A->B, который ведет к B->A и т. д. и т. д., что делает теорию THIS | VARIABLES спорной (это все равно произойдет)   -  person Shawn Holmes    schedule 23.04.2012


Ответы (2)


Включенная вами трассировка стека Java указывает на ошибку бесконечной рекурсии. Будьте осторожны при создании объектов типа A, у которых в псевдоконструкторе есть новый объект типа B. Если объект B сам создает объект типа A в своем псевдоконструкторе, вы сами получаете бесконечную рекурсию создаваемых объектов, заканчивающуюся уродливой трассировкой стека Java.

person Shawn Holmes    schedule 23.04.2012
comment
Да, я вижу, что это вызывает ошибку, но ничего в его коде этого не показывает. Я бы хотел, чтобы он опубликовал больше кода. - person Raymond Camden; 23.04.2012
comment
да .. его образец не показал дополнительного экземпляра, который мог бы вызвать это, но его комментарии, похоже, указывают на то, что это действительно было причиной. - person Mark A Kruger; 23.04.2012

Шон прав. Он опубликовал больше кода, и вы можете видеть, что two.cfc создает tools.cfc, а tools.cfc создает two.cfc.

Вам нужно перейти к настройке стиля инъекции (например, аля ColdSpring).

person Raymond Camden    schedule 23.04.2012