2013-04-07 5 views
1

У меня возникли проблемы с созданием подзадачи с использованием 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. Однако, когда он попадает в категории компонента, я получаю следующее сообщение об ошибке:

Bean creation exception during init() of core.com.categories.categoryGateway

component [core.com.categories.NestedSetTreeTable] has no function with name [getDatasource]:

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

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

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

+0

Я рекомендую вам разбить это на два вопроса (потому что они * являются * двумя вопросами). 1) проблема с методом getDatasource(); 2) как настроить родительское/вспомогательное приложение с Coldspring. И, возможно, третий вопрос - хотя и не подходит для S/O - о архитектуре вашего приложения. Все это в основном не связанные вопросы, и чрезмерно усложняют то, что вы просите здесь. –

+0

Возможно, вам больше повезло задать особые вопросы Coldspring на форуме Coldspring (https://groups.google.com/forum/?fromgroups#!forum/coldspring-users). Не похоже, что на S/O много опыта Coldspring. –

ответ

1

The injected component contains a private method, 'GetDatasource' which is called by the CategoryGateway component.

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

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

Это не имеет никакого значения, что CategoryGateway принимает NestedSetTreeTable в качестве аргумента: что не дает никакого особого доступа к CateoryGatewayNestedSetTreeTable's методов.

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

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

+0

Ahh, извините - я ошибся ... доступ - это «Пакет», а не «Частный». До недавнего времени я использовал CFC для инкапсуляции функций и не использовал OOP, поэтому все мои собственные CFC обычно содержали общедоступные методы ... Таким образом, меня легко путают. ;) Я обновлю этот вопрос, чтобы отразить это. Хлопеты Gateway и NestedSetTreeTable отлично работают в родительском приложении (и я их не писал!), Поэтому я уверен, что проблема будет связана с моей конфигурацией, а не с самими ХФУ. –

+0

Тем не менее: вы не должны видеть иное поведение. Coldspring ничем не повлияет на эти линии. Попробуйте разложить Coldspring во время поиска и устранения неполадок: просто используйте вызовы createObject() для создания экземпляров CFC. Это может дать более четкое представление о том, что происходит. –

+0

Имеет ли ваш subapp какие-либо разные сопоставления CF, которые могут сбивать с толку, так что CF думает, что эти два CFC не находятся в одном пакете? Это очень сомнительно (и я не вижу горячего, это может быть так), но это единственное, о чем я могу думать. –