我很难用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中显式地实例化它们。但是,当它到达类别组件时,我会收到以下错误:
core.com.categories.categoryGateway init()期间Bean创建异常 组件core.com.categories.NestedSetTreeTable没有名称为getDatasource的函数:
如果我将getDatasource方法公诸于众的话,它似乎是有效的--但这似乎不太正确,因为它在父应用程序中是一样的。
添加到我的新事物列表中,OOP和继承.所以如果我搞错了,请告诉我。我尝试的是将核心功能(用户管理、错误处理、验证和许多我倾向于在每个应用程序中重用的东西)与特定的应用程序功能(例如,电子商务站点可能有一个cart组件不需要CMS )分离开来,这样在我开发一个新功能时,我可以决定将它放在核心中,并将其提供给我的所有应用程序,或者特定的应用程序。因此,在本例中,我试图在父Application.cfc中加载核心功能,并使子函数能够自动使用它。理想情况下,子程序不应该指定Coldspring.xml中的核心功能,但是我还没有找到一种同时运行父函数和子函数的方法。
任何帮助,非常感谢!
发布于 2013-04-07 21:10:31
注入的组件包含一个私有方法“GetDatasource”,该方法由CategoryGateway组件调用。
你搞错了。如果GetDatasource对NestedSetTreeTable是私有的,那么CategoryGateway就无法访问它。完全停止。
只能从组件本身调用私有方法,或者在ComponentChild扩展ComponentParent的情况下,ComponentChild可以从ComponentParent调用私有方法。
CategoryGateway以NestedSetTreeTable作为参数是不相关的:这并不会赋予CateoryGateway对NestedSetTreeTable's方法的任何特殊访问权限。
Coldspring在这里也无关紧要:它只是一种组织对象实例化的机制,它不赋予任何特殊的权限,也不破坏方法访问的规则。
因此,在这种情况下--我不怀疑你看到的是环境之间的不同情况--你在你的问题中遗漏了一些关键信息。
https://stackoverflow.com/questions/15865973
复制相似问题