使用ColdSpring的子应用程序无法访问包方法

时间:2013-04-07 18:13:18

标签: coldfusion cfc subapplication 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> 

在类别1抛出错误之前,还有其他几个核心组件以这种方式加载 - 因此该技术似乎正在工作,我可以访问我的核心组件,而无需在子级的Application.cfc中显式实例化它们。 但是,当它到达类别组件时,我收到以下错误:

  

core.com.categories.categoryGateway

的init()期间的Bean创建异常      

组件[core.com.categories.NestedSetTreeTable]没有名称[getDatasource]的函数:

如果我将getDatasource方法公开,它似乎有效 - 但这似乎不对,因为它在父应用程序中工作。

添加到我刚接触的事物列表中,OOP和继承...所以如果我这样做完全错误的话请告诉我。 我正在尝试的是从特定的应用程序功能中分离核心功能(用户管理,错误处理,验证和我倾向于在每个应用程序中重用的一堆东西)(电子商务站点可能有一个不需要的购物车组件)例如,一个CMS,当我开发一个新功能时,我可以决定将它放在核心中,并使其可用于我的所有应用程序或特定应用程序。 所以在这个例子中,我试图在父的Application.cfc中加载核心功能,让孩子自动使用它。理想情况下,孩子不应该在Coldspring.xml中指定核心功能,但是我找不到运行父母和孩子的方法。

任何帮助,非常感谢!

1 个答案:

答案 0 :(得分:1)

  

注入的组件包含一个私有方法'GetDatasource'   这是由CategoryGateway组件调用的。

你错了。如果GetDatasourceNestedSetTreeTable的私有,那么CategoryGateway无法访问它。句号。

只能在组件内部调用私有方法,或者ComponentChild扩展ComponentParentComponentChild可以从ComponentParent调用私有方法。

CategoryGatewayNestedSetTreeTable作为参数是无关紧要的:这不会赋予CateoryGateway NestedSetTreeTable's方法任何特殊访问权限。

Coldspring在这里也无关紧要:它只是一种编组对象实例化的机制,它没有赋予任何特殊权力,也没有违反方法访问规则。

所以情况就是这样 - 我不怀疑你在环境之间看到不同的情况 - 你从你的问题中省略了一些关键信息。