Подприложение с ColdSpring не имеет доступа к методам пакета

У меня возникли проблемы с созданием подприложения с использованием ColdSpring для создания экземпляров моих объектов.

В моем родительском приложении у меня есть конфигурационный файл ColdSpring, который без проблем создает набор компонентов. Одним из них является компонент «Категории» (CategoryGateway), в который внедрен другой компонент для таблицы (NestedSetTreeTable). Внедренный компонент содержит метод пакета «GetDatasource», который вызывается компонентом CategoryGateway.

Это работает без проблем в моем родительском приложении, однако, когда я пытаюсь создать экземпляр компонента в своем подприложении, кажется, что метод пакета недоступен для компонента CategoryGateway.

Теперь я очень новичок в ColdSpring, а также в концепции создания подприложения из родительского приложения, поэтому я не уверен, что делаю все правильно.

Вот моя установка:

Родительское приложение содержит сопоставленную версию ColdSpring и собственный файл coldspring.xml. В файле coldspring.xml содержится следующее для создания экземпляра компонента категорий:

<!-- Categories CFC -->
<bean id="categories" parent="config" class="com.categories.categoryGateway">
    <constructor-arg name="sCategoriesTable">
        <value>${sCategoriesTable}</value>
    </constructor-arg>
    <constructor-arg name="sNSTTable">
        <value>${sNSTTable}</value>
    </constructor-arg>      
    <constructor-arg name="NST">
        <ref bean="categoriesNST" />
    </constructor-arg>      
</bean>

<!-- Categories NST Table CFC -->
<bean id="categoriesNST" parent="config" class="com.categories.NestedSetTreeTable">
    <constructor-arg name="datasourceName">
        <value>${sDSN}</value>
    </constructor-arg>
    <constructor-arg name="table">
        <value>${sNSTTable}</value>
    </constructor-arg>
</bean> 

В Application.cfc моего родителя я создаю экземпляр компонента следующим образом:

Application.com.categories = beanFactory.getBean('categories');

Все работает корректно. Теперь в моем вспомогательном приложении у меня есть другая сопоставленная версия ColdSpring и отдельный файл coldspring.xml, чтобы я мог использовать его для создания экземпляров компонентов, специфичных для вспомогательного приложения. Я проверил, что запускается правильный файл coldspring.xml.

Я не создаю экземпляры базовых компонентов в Application.cfc моего подприложения, а вызываю Super.onApplicationStart, чтобы запустить родительский метод. Родитель содержит код создания экземпляра, однако он использует дочерний файл Coldspring.xml для поиска компонентов, поэтому я создал сопоставление с родительским приложением и соответствующим образом скорректировал дочерний файл Coldspring.xml, так что это выглядит так:

<!-- Categories CFC -->
<bean id="categories" parent="config" class="core.com.categories.categoryGateway">
    <constructor-arg name="sCategoriesTable">
        <value>${sCategoriesTable}</value>
    </constructor-arg>
    <constructor-arg name="sNSTTable">
        <value>${sNSTTable}</value>
    </constructor-arg>      
    <constructor-arg name="NST">
        <ref bean="categoriesNST" />
    </constructor-arg>      
</bean>

<!-- Categories NST Table CFC -->
<bean id="categoriesNST" parent="config" class="core.com.categories.NestedSetTreeTable">
    <constructor-arg name="datasourceName">
        <value>${sDSN}</value>
    </constructor-arg>
    <constructor-arg name="table">
        <value>${sNSTTable}</value>
    </constructor-arg>
</bean> 

Есть несколько других основных компонентов, которые загружаются таким образом до того, как категории выдают ошибку, поэтому метод работает, и у меня есть доступ к моим основным компонентам без явного создания их экземпляров в дочернем Application.cfc. Однако, когда он попадает в компонент категорий, я получаю следующую ошибку:

Исключение создания компонента во время init() для core.com.categories.categoryGateway

компонент [core.com.categories.NestedSetTreeTable] не имеет функции с именем [getDatasource]:

Если я сделаю метод getDatasource общедоступным, он, кажется, сработает, однако это не кажется правильным, поскольку он работает так же, как и в родительском приложении.

Добавьте к списку вещей, в которых я новичок, ООП и наследование... так что, если я делаю это совершенно неправильно, пожалуйста, дайте мне знать. Я пытаюсь отделить основные функции (управление пользователями, обработка ошибок, проверка и множество других вещей, которые я склонен повторно использовать в каждом приложении) от конкретных функций приложения (сайт электронной коммерции может иметь компонент корзины, не требуемый CMS, например) таким образом, что при разработке новой функции я могу решить поместить ее в ядро ​​​​и сделать ее доступной для всех моих приложений или для конкретного приложения. Итак, в этом примере я пытаюсь загрузить основные функции в Application.cfc родителя, чтобы потомок мог их использовать автоматически. В идеале дочерний элемент не должен указывать основные функции в файле Coldspring.xml, но я не нашел способа запуска родительского и дочернего компонентов.

Любая помощь, очень ценится!


person Gary Stanton    schedule 07.04.2013    source источник
comment
Я рекомендую вам разбить это на два вопроса (потому что это является двумя вопросами). 1) проблема с методом getDatasource(); 2) как настроить родительское/дочернее приложение с помощью Coldspring. И, возможно, третий вопрос — хотя он и не подходит для S/O — об архитектуре вашего приложения. Все это в основном несвязанные вопросы, и они слишком усложняют то, что вы здесь задаете.   -  person Adam Cameron    schedule 08.04.2013
comment
Возможно, вам больше повезет, если вы зададите вопросы, касающиеся Coldspring, на форуме Coldspring (группы). .google.com/forum/?fromgroups#!forum/coldspring-users). Не похоже, что у Coldspring много опыта в S/O.   -  person Adam Cameron    schedule 08.04.2013


Ответы (1)


Внедренный компонент содержит закрытый метод GetDatasource, который вызывается компонентом CategoryGateway.

Вы ошибаетесь здесь. Если GetDatasource является частным для NestedSetTreeTable, то CategoryGateway не имеет к нему доступа. Полная остановка.

Приватные методы можно вызывать только из самого компонента, или в ситуации, когда ComponentChild расширяет ComponentParent, ComponentChild может вызывать приватные методы из ComponentParent.

Неважно, что CategoryGateway принимает NestedSetTreeTable в качестве аргумента: это не дает никакого специального доступа для методов от CateoryGateway до NestedSetTreeTable's.

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

Так что в этом случае - и я не сомневаюсь, что вы видите несопоставимые ситуации между вашими средами - вы опускаете некоторую ключевую информацию в своем вопросе.

person Adam Cameron    schedule 07.04.2013
comment
Ааа, извините - я ошибся... доступ "Пакетный", а не "Частный". До недавнего времени я использовал CFC для инкапсуляции функций и на самом деле не использовал ООП, поэтому все мои собственные CFC обычно содержали общедоступные методы... Таким образом, я легко запутался. ;) Я обновлю вопрос, чтобы отразить это. CFC Gateway и NestedSetTreeTable отлично работают в родительском приложении (и я их не писал!), поэтому я почти уверен, что проблема будет связана с моей конфигурацией, а не с самими CFC. - person Gary Stanton; 08.04.2013
comment
Тем не менее: вы не должны видеть другое поведение. Coldspring не повлияет ни на что в этом направлении. Попробуйте исключить Coldspring при устранении неполадок: просто используйте вызовы createObject() для создания экземпляров CFC. Это может дать более четкое представление о том, что происходит. - person Adam Cameron; 08.04.2013
comment
Есть ли в вашем подприложении какие-либо другие сопоставления CF, которые могут сбивать с толку, так что CF считает, что эти два CFC не находятся в одном пакете? Это очень сомнительно (и я не вижу, чтобы это могло быть так), но это единственное, о чем я могу думать. - person Adam Cameron; 08.04.2013
comment
Вы правы... Я убрал Coldspring из уравнения, и у меня возникла та же проблема, что и вручную. Для меня это не имеет никакого смысла. У меня есть пара других отображений, но ничего близкого к этому воплощению. Я собираюсь повозиться и посмотреть, смогу ли я получить больше информации. Очевидно, что этот вопрос не имеет ничего общего с Coldspring, но я воздержусь от его обновления, пока не выясню, что мне следует обновлять /с/. - person Gary Stanton; 08.04.2013
comment
Не могли бы вы опубликовать следующие вещи в pastebin или что-то в этом роде: 1) ваши файлы Application.cfc (основное и вспомогательное приложение). Нам нужны только вещи в псевдоконструкторе, а не фактические методы; 2) представление структуры каталогов обоих приложений с указанием как корня документа HTTP, так и корня CF, а также расположения файлов Application.cfc и CFC; 3) код инстанцирования для CFC (может быть, onApplicationStart()?); 4) соответствующие биты кода CFC, необходимые для воспроизведения этого. Таким образом, урезанный метод init() плюс не найденный метод. Все остальное должно быть неважно. - person Adam Cameron; 08.04.2013
comment
Я ценю вашу готовность разобраться в моем коде! Однако кажется несколько смущающим, что теперь это работает после перезагрузки сервера ... Мне интересно, может быть, это было вызвано тем, что Railo кэшировал что-то в сопоставлении? Что касается вашего комментария об архитектуре моего приложения, я уже некоторое время работаю над ним, и мне было очень трудно найти примеры, учебные пособия или обсуждения правильного способа сделать это. Мое приложение/подприложение кажется выполнимым, но не совсем правильным. У вас есть мнение о методологии, которую я мог бы исследовать? - person Gary Stanton; 08.04.2013
comment
Хе. Упс. Гм, судя по тому, что вы описываете, мне кажется, что вы на правильном пути. Возможно, google application.cfc parent child и/или application.cfc наследование и просмотрите первые несколько страниц результатов, чтобы увидеть, что говорят люди. Это даст вам хорошую информацию и больше идей для rfined строки поиска. - person Adam Cameron; 08.04.2013