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

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

В моем родительском приложении у меня есть конфигурационный файл ColdSpring, который создает множество компонентов без проблем. Одним из них является компонент 'Categories' (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, но я не нашел способа запустить родительский и дочерний процесс.

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

1 ответ

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

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

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

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

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

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

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