2013-04-07 85 views
1

我在创建使用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中显式实例化它们。 然而,当它到达的类别组成部分,我收到以下错误:

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

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

如果我做了getDataSource的方法公开,似乎工作 - 但是这似乎并不正确,因为它的工作原理是为在父应用程序中。

添加到我新来的东西,OOP和继承...所以如果我要完全错误的方式,那么请让我知道。 我试图从特定应用程序功能中分离出核心功能(用户管理,错误处理,验证以及一些我倾向于在每个应用程序中重复使用的内容)(电子商务网站可能不需要购物车组件以CMS为例),以这种方式,当我开发一项新功能时,我可以决定将其放入核心,并将其提供给所有应用程序或特定应用程序。 所以在这个例子中,我试图在父级的Application.cfc中加载核心功能,并让孩子自动地使用它。理想情况下,孩子不应该在Coldspring.xml中指定核心功能,但我还没有找到同时运行父母和孩子的方法。

任何帮助,非常感谢!

+0

我建议你打破了这一点到两个问题(因为*的*两个问题)。 1)'getDatasource()'方法的问题; 2)如何使用Coldspring配置父/子应用程序。可能还有第三个问题 - 尽管不适合S/O - 关于应用程序的架构。这些都是大多数不相关的问题,并使你在这里问的问题过于复杂。 – 2013-04-07 21:16:25

+0

你可能有更多的运气,要求对Coldspring论坛具体Coldspring-问题(https://groups.google.com/forum/?fromgroups#!forum/coldspring-users)。它看起来并不像S/O上的Coldspring专业知识。 – 2013-04-07 21:28:26

回答

1

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

你在这里弄错了。如果GetDatasource是私人NestedSetTreeTable,然后CategoryGateway无法对其进行访问。句号。

人们只能从调用组件本身,或在ComponentChild延伸ComponentParentComponentChild可以从ComponentParent调用私有方法的情况中私有方法。

CategoryGatewayNestedSetTreeTable作为参数是没有关系的:它不赋予CateoryGatewayNestedSetTreeTable's方法的任何特殊访问权限。

Coldspring也是无关紧要的位置:它只是一个编组对象的实例化的机制,它并没有赋予任何特殊的权力,也没有突破的方法访问规则。

所以这既然如此 - 我不怀疑你看到你的环境之间的不同的情况 - 你会忽略从你的问题的一些关键信息。

+0

啊,对不起 - 我错了...访问是'包',而不是'私人'。直到最近,我一直在使用CFC来封装函数,而不是真的使用OOP,所以我所有的CFC通常都包含公共方法......因此我很容易混淆。 ;) 我会更新问题以反映这一点。 网关和NestedSetTreeTable氯氟烃主应用程式中完美地工作,(我没有写他们!),所以我敢肯定,这个问题将是我的配置,而不是氟氯化碳自己。 – 2013-04-07 21:17:53

+0

仍然:你不应该看到不同的行为。 Coldspring不会影响这些方面的任何内容。在排除故障时尝试分解Coldspring:只需使用createObject()调用实例化CFC即可。这可以更清楚地了解发生了什么。 – 2013-04-07 21:24:05

+0

贵subapp有任何不同的CF映射可能是混乱的问题,使CF认为这两个氟氯化碳不在同一个包?这是非常令人怀疑的(我不能认为它可能是这样),但这是我能想到的唯一的事情。 – 2013-04-07 21:26:06

相关问题