Подприложение с 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 здесь также не имеет значения: это всего лишь механизм для создания экземпляров объектов, он не наделяет никакими специальными полномочиями и не нарушает правила доступа к методам.
Таким образом, это так - и я не сомневаюсь, что вы видите разные ситуации в вашей среде, - вы пропускаете некоторую ключевую информацию в своем вопросе.