Le framework Spring - chargeur de classe de la relation
J'ai un problème qui est probablement lié au Printemps /chargeur de classe de la relation.
Je vous prie de m'excuser pour le niveau de verbosité de la question maintenant.
J'ai un certain nombre de legs applications java qui ont été à l'origine écrit et prévu pour fonctionner à l'intérieur d'une JVM dédiée. Nous avons décidé, après examen de l'utilisation des ressources que des économies pourraient être réalisées par l'exécution de plusieurs applications au sein d'une seule JVM. Dans ce contexte, j'ai écrit un conteneur gestionnaire spécialement conçu pour notre environnement qui est capable d'exécuter chaque application dans un conteneur (ou bac à sable). La base de cette capacité à isoler des conteneurs est bien sûr un class loader personnalisé.
Tout fonctionne bien jusqu'à ce que nous sommes venus à travers une application qui utilise le framework Spring. J'ai un Ressort fichier de configuration avec les fragments ci-dessous.
<bean id="MDDStructurPackager" class="abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000">
<property name="logger">
<ref local="Logger"/>
</property>
<property name="realm">
<value>unpack</value>
</property>
</bean>
<bean id="Jakarta" class="abc.def.mdd.channel.corba.M2000AlarmChannel">
<constructor-arg>
<ref bean="MDDStructurPackager"/>
</constructor-arg>
<property name="interactionLayer">
<ref local="MDDInteractionLayer"/>
</property>
<property name="logger">
<ref local="Logger"/>
</property>
<property name="tempFile" value="/opt/app/abcdef/rt_dev/var/cache/dat/Huawei_M2000_Jakarta.dat"/>
<property name="host" value="M2000Jakarta.ior"/>
<property name="irpReference" value="clarity"/>
<property name="name" value="M2000Jakarta"/>
<property name="realm" value="Jakarta"/>
<property name="natAddress" value="99.999.99.9" />
</bean>
Ce qui suit est un fragment du fichier journal que le Printemps est l'instanciation de la les haricots.
DEBUG [Sud de l'Agent 1] (DefaultSingletonBeanRegistry.java:162) - la Création d'instance partagée de singleton bean "MDDStructurPackager'
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - la Création d'instance de bean "MDDStructurPackager'
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:453) - avec Impatience la mise en cache bean "MDDStructurPackager' pour permettre de résoudre les éventuelles références circulaires
DEBUG [Sud de l'Agent 1] (AbstractBeanFactory.java:213) - de Retour en cache instance du singleton bean "Logger"
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:242) - prise en BeanInfo pour la classe [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:258) - mise en Cache PropertyDescriptors pour la classe [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété de "classe" de type [java.lang.Class]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "colectionDate" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "composant" de type [abc.def.mdd.msg.MDDComponent]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété 'fileType' de type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "listCommonWords" du type [java.util.ArrayList]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "listHeader" du type [java.util.ArrayList]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "logger" de type [abc.def.mdd.enregistreur.Enregistreur]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "mapDelimiter" du type [java.util.Carte]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "mapElement" du type [java.util.Carte]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "namePackager" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "nameSpaceXMLSchema" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "nodeName" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "packageXMLSchema" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "processingLayerListener" du type [abc.def.mdd.canal.ProcessingLayerListener]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "royaume" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (CachedIntrospectionResults.java:267) - haricot propriété "statesObject" du type [java.lang.Chaîne]
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:406) - Terminé la création de l'instance de bean "MDDStructurPackager'
DEBUG [Sud de l'Agent 1] (DefaultSingletonBeanRegistry.java:162) - la Création d'instance partagée de singleton bean "ListAlarmChannel'
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - la Création d'instance de bean "ListAlarmChannel'
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:453) - avec Impatience la mise en cache bean "ListAlarmChannel' pour permettre de résoudre les éventuelles références circulaires
DEBUG [Sud de l'Agent 1] (DefaultSingletonBeanRegistry.java:162) - la Création d'instance partagée de singleton bean "Jakarta'
DEBUG [Sud de l'Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - la Création d'instance de bean "Jakarta'
DEBUG [Sud de l'Agent 1] (AbstractBeanFactory.java:213) - de Retour en cache instance du singleton bean "MDDStructurPackager'
INFO: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Ajout d' "/opt/app/abcdef/rt_dev/lib/logkit-1.2.jar" le chemin de classe.
INFO: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Ajout d' "/opt/app/abcdef/rt_dev/lib/avalon-framework-4.1.5.jar" le chemin de classe.
INFO: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Ajout d' "/opt/app/abcdef/rt_dev/lib/concurrent-1.3.2.jar" le chemin de classe.
INFO: CORBA_HUAWEI_M2KJKT_ALARM (23447542): Ajout d' "/opt/app/abcdef/rt_dev/lib/antlr-2.7.2.jar" le chemin de classe.
DEBUG [Sud de l'Agent 1] (ConstructorResolver.java:195) -
Ignorant du constructeur [publique abc.def.mdd.canal.corba.M2000AlarmChannel(
java.lang.Chaîne,
int,
java.lang.Chaîne,
java.lang.Chaîne,
com.citycorp.mdd.msg.MDDComponent
) throws java.lang.Exception
]
de bean "Jakarta': org.springframework.les haricots.usine.UnsatisfiedDependencyException:
Erreur lors de la création de haricots avec le nom "Jakarta" défini dans le fichier [/opt/app/abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml]:
Insatisfait de la dépendance exprimée à travers argument du constructeur avec l'index 0 de type [java.lang.String]:
Impossible de convertir constructeur de la valeur de l'argument de type [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000] de type [java.lang.String]:
Impossible de convertir une valeur de type [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000] de type [java.lang.String];
nested exception java.lang.IllegalArgumentException:
Ne peut pas convertir une valeur de type [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000] de type [java.lang.String]:
l'absence de correspondance des éditeurs ou stratégie de conversion trouvé
Suivent les signatures des constructeurs pour l'abc.def.mdd.canal.corba.M2000AlarmChannel classe:
public M2000AlarmChannel( MDDComponent composante )
public M2000AlarmChannel( String host, int port, String username, String password, MDDComponent composante )
La classe abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000 implémente MDDComponent (haricot MDDStructurPackager).
Comme vous pouvez le voir, le Printemps est l'instanciation de certains des haricots ie. MDDStructurPackager sans problème.
Le problème, c'est l'instanciation de la "Jakarta" de haricot.
Les implications de lignes:
Erreur lors de la création de haricots avec le nom "Jakarta" défini dans le fichier [/opt/app/abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml]:
Insatisfait de la dépendance exprimée à travers argument du constructeur avec l'index 0 de type [java.lang.String]:
Impossible de convertir constructeur de la valeur de l'argument de type [abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000] de type [java.lang.String]:
ne sont pas claires. Je ne suis pas sûr que les raisons pour le type de confusion lors de la tentative de déterminer le constructeur approprié. Il est possible que le problème est associé avec le chargement de l'interface MDDComponent. Si il a été chargé à deux reprises, par différents chargeurs de classe qui ne sont pas liés dans la hiérarchie des chargeurs de classe que vous pouvez imaginer les problèmes associés à la détermination de la bonne constructeur.
Toutes les idées reçues avec gratitude, je suis à saisir les pailles.
Merci
Bryan
OriginalL'auteur | 2009-02-16
Vous devez vous connecter pour publier un commentaire.
À partir du message d'erreur, il semble que le Printemps est de tenter d'instancier l'objet avec ce constructeur:
Ressemble Printemps est confus sur quel constructeur à utiliser, peut-être parce que les deux constructeurs ont un
MDDComponent
paramètre (dans un sens, les deux constructeurs ont ce que leur dernier paramètre, je suis curieux de savoir si cela a quelque chose à voir avec la logique que le Printemps utilise pour déterminer quel constructeur à utiliser. De toute façon...).Selon la Printemps manuel, il y a des paramètres que vous pouvez ajouter à la
<constructor-arg>
élément à l'aide du conteneur résoudre constructeur à utiliser:Vous pouvez ajouter "type":
ou vous pouvez ajouter un index:
(Vous pouvez probablement spécifier à la fois, si vous voulez vraiment)
L'ajout d'un ou deux de ceux-ci devraient aider le Printemps résoudre constructeur à utiliser.
Comme corollaire, si cela ne vous aide pas, vous pouvez simplement modifier la définition XML de passe dans les paramètres requis pour l'autre constructeur, l'un Printemps, il est tentant d'utiliser?
BTW, il peut rendre votre question beaucoup plus lisible d'utiliser la citation des balises au sein d'ADM.
Tu veux dire "autonome" comme dans l'aide de Printemps, mais pas votre maison brassée application conteneur?
Qui est correct.
Ensuite, vous voudrez peut-être regarder en vérifiant si en quelque sorte une version différente de la classe abc.def.mdd.canal.corba.M2000AlarmChannel est sur le chemin de la classe
avez-vous essayé d'isoler cette application, par exemple l'exécution d'elle par lui-même dans le conteneur? Si vous utilisez d'autres applications dans la même JVM, arrêtez tout et essayez celui-ci sur son propre.
OriginalL'auteur matt b
En fait, je pense qu'il est. Le premier argument du constructeur que vous passez à Jakarta objet est de type abc.def.mdd.msg.l'alarme.huawei.MDDPackagerAlarmM2000, mais le ctor veut une Chaîne de caractères. Faire les types correspondent correctement.
Il se lit comme un simple message. Ce qui me manque?
Je vais supposer à partir de la structure du package que ce sont vos classes. Vrai?
Je dois être fatigué. Désolé, je l'ai raté.
L'autre partie de la question de cours est quel constructeur est-il en train de considérer. Selon le journal, il a décidé d'ignorer l'un d'entre eux, comme il se doit. Pourquoi il pense qu'il a besoin d'un argument de type String? Ou est l'exigence d'une Chaîne à un artefact de choisir le mauvais constructeur?
OriginalL'auteur duffymo
Vous êtes en contrôle de la
AlarmChannel
classe? Si oui, pouvez-vous lancer une nouvelle version, ce qui a un rapport d'impression dans le constructeur (vous pouvez également utilisertry-catch
dans unstatic
initialiseur d'obtenir une trace de la pile d'où la classe est initialisée à partir d')?De cette façon, vous pouvez obtenir une idée de savoir si il y a des doublons de classes impliquées
Également dans le Ressort de fichier de configuration que vous pourriez provoquer la
ClassLoader
pour être imprimés à l'aide d'unMethodInvokingFactoryBean
- cela pourrait également jeter quelque lumière sur la question?Pouvez-vous la sous-classe AlarmChannel et ajouter de l'info, ou est-il définitif?
Je n'ai pas d'accès direct au logiciel en cours d'exécution dans le conteneur. Tout ce que je fais doit être fait dans le conteneur gestionnaire.
Je suis un peu confus, désolé. Alors, comment savez-vous ce que le constructeur signatures de la AlarmChannel ressembler? Vous pouvez déboguer le Printemps conteneur dans lequel il est en fait de prendre le nom de la classe et d'essayer de trouver le constructeur? Ou rouler votre propre application en contexte avec d'enregistrement des déclarations?
J'ai demandé au vendeur pour le constructeur signatures, mais je ne peux pas obtenir le code source complet. Je suis en train de construire un environnement à double (logiquement au moins) de l'environnement.
OriginalL'auteur oxbow_lakes