1

我无法使用 ColdSpring 创建子应用程序来实例化我的对象。

在我的父应用程序中,我有一个 ColdSpring 配置文件,它可以毫无问题地实例化一堆组件。其中一个是“类别”(CategoryGateway) 组件,其中注入了另一个用于表的组件 (NestedSetTreeTable)。注入的组件包含一个由 CategoryGateway 组件调用的封装方法“GetDatasource”。

这在我的父应用程序中没有问题,但是当我尝试在我的子应用程序中实例化组件时,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 和继承......所以如果我完全错误地处理这个问题,请告诉我。我正在尝试将核心功能(用户管理、错误处理、验证和我倾向于在每个应用程序中重用的一堆东西)与特定应用程序功能(电子商务网站可能有一个购物车组件不需要例如 CMS),这样当我开发新功能时,我可以决定将其放入核心并使其可用于我的所有应用程序或特定应用程序。所以在这个例子中,我试图在父母的 Application.cfc 中加载核心功能,并让孩子自动能够使用它。理想情况下,孩子不必在 Coldspring.xml 中指定核心功能,但我'

任何帮助,非常感谢!

4

1 回答 1

1

注入的组件包含一个私有方法“GetDatasource”,由 CategoryGateway 组件调用。

你在这里弄错了。如果GetDatasource是私有的NestedSetTreeTable,则CategoryGateway无权访问它。句号。

只能从组件本身调用私有方法,或者在ComponentChild扩展的情况下ComponentParentComponentChild可以从ComponentParent.

CategoryGateway将 a作为参数是无关紧要NestedSetTreeTable的:它不授予CateoryGatewayNestedSetTreeTable's方法的任何特殊访问权限。

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

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

于 2013-04-07T21:10:31.193 回答