おそらくSpring /クラスローダーの関係に関連する問題があります。
私は今、質問の冗長さをお詫びします。
専用の JVM 内で実行することを意図して作成されたレガシー Java アプリケーションが多数あります。リソースの使用状況を調べた結果、単一の JVM 内で複数のアプリケーションを実行することで効率が向上することがわかりました。そのコンテキスト内で、コンテナー (またはサンドボックス) 内で各アプリケーションを実行できる、環境用に特別に設計されたコンテナー マネージャーを作成しました。コンテナを分離するこの機能の基礎は、もちろんカスタム クラス ローダーです。
Spring フレームワークを使用するアプリケーションに遭遇するまで、すべてがうまく機能します。以下のようなフラグメントを含む Spring 構成ファイルがあります。
<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>
以下は、Spring が Bean をインスタンス化しているときのログ ファイルの一部です。
DEBUG [South Agent 1] (DefaultSingletonBeanRegistry.java:162) - シングルトン Bean 'MDDStructurPackager' の共有インスタンスを作成しています
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - Bean 'MDDStructurPackager' のインスタンスを作成しています
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:453) - Bean 'MDDStructurPackager' を熱心にキャッシュして、潜在的な循環参照を解決できるようにする
DEBUG [South Agent 1] (AbstractBeanFactory.java:213) - シングルトン Bean 'Logger' のキャッシュされたインスタンスを返す
DEBUG [South Agent 1] (CachedIntrospectionResults.java:242) - クラス [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] の BeanInfo の取得
DEBUG [South Agent 1] (CachedIntrospectionResults.java:258) - クラス [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] の PropertyDescriptors のキャッシュ
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.Class] の Bean プロパティ 'class' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'colectionDate' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [abc.def.mdd.msg.MDDComponent] の Bean プロパティ 'component' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'fileType' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.util.ArrayList] の Bean プロパティ 'listCommonWords' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.util.ArrayList] の Bean プロパティ 'listHeader' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [abc.def.mdd.logger.Logger] の Bean プロパティ 'logger' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.util.Map] の Bean プロパティ 'mapDelimiter' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.util.Map] の Bean プロパティ 'mapElement' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'namePackager' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'nameSpaceXMLSchema' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'nodeName' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'packageXMLSchema' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [abc.def.mdd.channel.ProcessingLayerListener] の Bean プロパティ 'processingLayerListener' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'realm' が見つかりました
DEBUG [South Agent 1] (CachedIntrospectionResults.java:267) - タイプ [java.lang.String] の Bean プロパティ 'statesObject' が見つかりました
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:406) - Bean 'MDDStructurPackager' のインスタンスの作成が完了しました
DEBUG [South Agent 1] (DefaultSingletonBeanRegistry.java:162) - シングルトン Bean 'ListAlarmChannel' の共有インスタンスの作成
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - Bean 'ListAlarmChannel' のインスタンスを作成しています
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:453) - 潜在的な循環参照を解決できるように、Bean 'ListAlarmChannel' を熱心にキャッシュする
DEBUG [South Agent 1] (DefaultSingletonBeanRegistry.java:162) - シングルトン Bean 'Jakarta' の共有インスタンスの作成
DEBUG [South Agent 1] (AbstractAutowireCapableBeanFactory.java:378) - Bean 'Jakarta' のインスタンスを作成しています
DEBUG [South Agent 1] (AbstractBeanFactory.java:213) - シングルトン Bean 'MDDStructurPackager' のキャッシュされたインスタンスを返す
情報: CORBA_HUAWEI_M2KJKT_ALARM (23447542): クラスパスに「/opt/app/abcdef/rt_dev/lib/logkit-1.2.jar」を追加しました。
情報: CORBA_HUAWEI_M2KJKT_ALARM (23447542): クラスパスに「/opt/app/abcdef/rt_dev/lib/avalon-framework-4.1.5.jar」を追加しました。
情報: CORBA_HUAWEI_M2KJKT_ALARM (23447542): クラスパスに「/opt/app/abcdef/rt_dev/lib/concurrent-1.3.2.jar」を追加しました。
情報: CORBA_HUAWEI_M2KJKT_ALARM (23447542): クラスパスに「/opt/app/abcdef/rt_dev/lib/antlr-2.7.2.jar」を追加しました。
DEBUG [South Agent 1] (ConstructorResolver.java:195) -
コンストラクタ [public abc.def.mdd.channel.corba.M2000AlarmChannel(
java.lang.String, int, java.lang.String, java.lang.String, com.citycorp.mdd.msg.MDDComponent ) は
、Bean 'Jakarta' の java.lang.Exception ] をスローします: org.springframework.beans.factory.UnsatisfiedDependencyException:
ファイル [/opt/app/ abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml]:
タイプ [java.lang.String] のインデックス 0 を持つコンストラクター引数によって表現された満たされていない依存関係:
タイプ [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] のコンストラクタ引数値を必要なタイプ [java.lang.String] に変換できませんでした: タイプ [abc.def.mdd.msg.alarm の値を変換できませんでし
た] .huawei.MDDPackagerAlarmM2000] を必要なタイプ [java.lang.String] に変更します。
ネストされた例外は java.lang.IllegalArgumentException: 型 [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] の値を必要な型 [java.lang.String] に変換できません:
一致するエディターまたは変換戦略が見つかりません
以下は、abc.def.mdd.channel.corba.M2000AlarmChannel クラスのコンストラクターのシグネチャです。
public M2000AlarmChannel( MDDComponent コンポーネント )
public M2000AlarmChannel( String host, int port, String username, String password, MDDComponent componenet )
クラス abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000 は、MDDComponent (bean MDDStructurPackager) を実装します。
ご覧のとおり、Spring はいくつかの Bean をインスタンス化しています。MDDStructurPackager は問題ありません。
問題は、'Jakarta' Bean のインスタンス化です。
行の意味:
ファイル [/opt/app/abcdef/rt_dev/etc/HUAWEI_M2KJKT_ALARM.xml] で定義された「Jakarta」という名前の Bean の作成中にエラーが発生しました:
タイプ [java.lang.String] のインデックス 0 を持つコンストラクター引数によって表現された満たされていない依存関係:
タイプ [abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000] のコンストラクタ引数値を必要なタイプ [java.lang.String] に変換できませんでした:
明確ではありません。適切なコンストラクターを決定しようとするときの型の混乱の理由がわかりません。この問題は、インターフェース MDDComponent のロードに関連している可能性があります。クラスローダー階層で関連していない異なるクラスローダーによって2回ロードされた場合、正しいコンストラクターの決定に関連する問題が想像できます。
ありがたく受け取ったアイデアはすべて、私はストローをつかんでいます。
ありがとうブライアン