2013-04-07 2 views
1

Je n'arrive pas à créer une sous-application utilisant ColdSpring pour instancier mes objets.La sous-application avec ColdSpring n'a pas accès aux méthodes de package

Dans mon application parente, j'ai un fichier de configuration ColdSpring qui instancie un tas de composants sans problème. L'un d'entre eux est un composant 'Categories' (CategoryGateway), qui a un autre composant pour la table (NestedSetTreeTable) injecté dedans. Le composant injecté contient une méthode de package, 'GetDatasource', appelée par le composant CategoryGateway.

Cela fonctionne sans problèmes dans mon application parente, cependant lorsque j'essaie d'instancier le composant dans mon sous-application, il semble que la méthode du package soit inaccessible au composant CategoryGateway.

Maintenant, je suis très nouveau dans ColdSpring - et aussi au concept de créer une sous-application à partir d'une application parente - donc je ne suis pas sûr de faire les choses correctement.

Voici mon mise en place:

app Parent contient une version de mappée COLDSPRING et sa propre coldspring.xml. Le coldspring.xml contient les éléments suivants pour instancier les catégories de composants:

<!-- 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> 

Dans Application.cfc de mes parents, j'instancier ainsi le composant:

Application.com.categories = beanFactory.getBean('categories'); 

Tout fonctionne correctement. Maintenant, dans ma sous-application, j'ai une autre version mappée de ColdSpring, et un fichier coldspring.xml séparé afin que je puisse l'utiliser pour instancier des composants spécifiques à l'application secondaire. J'ai vérifié que le fichier coldspring.xml correct est en cours d'exécution.

Je n'instancie pas les composants de base dans Application.cfc de mon sous-application, mais j'appelle Super.onApplicationStart pour que la méthode parente soit exécutée. contient le code instanciation du parent, mais il utilise Coldspring.xml de l'enfant à trouver les composants - donc j'ai créé une cartographie à l'application mère, et ajusté en conséquence Coldspring.xml de l'enfant - donc ce lit comme suit:

<!-- 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> 

Plusieurs autres composants principaux sont chargés de cette manière avant que les catégories 1 ne génèrent une erreur. La technique semble donc fonctionner et j'ai accès à mes composants de base sans les instancier explicitement dans Application.cfc de l'enfant. Cependant, quand il arrive à la catégorie des composants, je reçois l'erreur suivante:

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

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

Si je fais le public méthode getDataSource, il semble fonctionner - mais cela ne semble pas juste, car il fonctionne comme il est dans l'application parente

Ajouter à la liste des choses que je suis nouveau, OOP et l'héritage ... donc si je vais à ce sujet tout à fait le mauvais sens alors s'il vous plaît faites le moi savoir. Ce que je tente est la séparation des fonctionnalités de base (gestion des utilisateurs, gestion des erreurs, validation et un tas de choses que j'ai tendance à réutiliser dans chaque application) à partir des fonctionnalités spécifiques des applications (un site e-commerce peut nécessiter un composant panier par un CMS, par exemple) de telle sorte que lorsque je développe une nouvelle fonctionnalité, je peux décider de la mettre dans le noyau et de la rendre disponible pour toutes mes applications, ou dans l'application spécifique. Donc, dans cet exemple, j'essaie de charger la fonctionnalité de base dans le fichier Application.cfc du parent et de permettre à l'enfant de l'utiliser automatiquement.Idéalement, l'enfant ne devrait pas avoir à spécifier la fonctionnalité de base dans Coldspring.xml, mais je n'ai pas trouvé un moyen d'exécuter à la fois le parent et l'enfant.

Toute aide, très appréciée!

+0

Je vous recommande de diviser cette question en deux questions (parce qu'elles * sont * deux questions). 1) le problème avec la méthode 'getDatasource()'; 2) comment configurer votre parent/sous-application avec Coldspring. Et peut-être une troisième question - bien que pas un bon choix pour S/O - sur l'architecture de votre application. Ce sont toutes des questions pour la plupart sans rapport, et compliquent trop ce que vous demandez ici. –

+0

Vous aurez peut-être plus de chance de poser des questions spécifiques à Coldspring sur le forum Coldspring (https://groups.google.com/forum/?fromgroups#!forum/coldspring-users). Il ne semble pas qu'il y ait beaucoup d'expertise Coldspring en S/O. –

Répondre

1

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

Vous vous trompez ici. Si GetDatasource est privé à NestedSetTreeTable, alors CategoryGateway n'a pas accès. Arrêt complet.

On ne peut appeler des méthodes privées de l'intérieur du composant lui-même, ou dans une situation où ComponentChild étend ComponentParent, ComponentChild peut appeler des méthodes privées de ComponentParent.

Il est sans importance que prend un CategoryGatewayNestedSetTreeTable comme argument: qui ne confère aucun accès spécial pour CateoryGateway à NestedSetTreeTable's méthodes.

Coldspring n'est pas non plus pertinent ici: c'est juste un mécanisme pour rassembler l'instanciation d'objets, il ne confère aucun pouvoir spécial, ni ne brise les règles d'accès à la méthode.

Cela étant le cas - et je ne doute pas que vous voyez des situations disparates entre vos environnements - vous omettez certaines informations clés de votre question.

+0

Ahh, désolé - je me trompais ... l'accès est 'Package', pas 'Private'. Jusqu'à très récemment, j'utilisais des CFC pour encapsuler des fonctions et je n'utilisais pas vraiment la POO, alors tous mes propres CFC contenaient généralement des méthodes publiques ... Donc je suis facilement confus. ;) Je vais mettre à jour la question pour refléter cela. Les CFC Gateway et NestedSetTreeTable fonctionnent parfaitement dans l'application parente, (et je ne les ai pas écrits!), Donc je suis à peu près sûr que le problème viendra de ma configuration plutôt que des CFC eux-mêmes. –

+0

Encore: vous ne devriez pas voir un comportement différent. Coldspring n'affectera rien dans ce sens. Essayez d'extraire Coldspring pendant le dépannage: utilisez simplement les appels createObject() pour instancier les CFC. Cela pourrait donner une image plus claire de ce qui se passe. –

+0

Est-ce que votre sous-application a des mappages CF différents qui pourraient être source de confusion, de sorte que CF pense que ces deux CFC ne sont pas dans le même paquet? C'est très douteux (et je ne vois pas comment ça pourrait être le cas), mais c'est la seule chose à laquelle je peux penser. –

Questions connexes