3

おそらく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回ロードされた場合、正しいコンストラクターの決定に関連する問題が想像できます。

ありがたく受け取ったアイデアはすべて、私はストローをつかんでいます。

ありがとうブライアン

4

3 に答える 3

3

エラー メッセージから、Spring がこのコンストラクターでオブジェクトをインスタンス化しようとしているように見えます。

public M2000AlarmChannel(String host, int port, String username, String password, MDDComponent componenet)

おそらく両方のコンストラクターにMDDComponentパラメーターがあるため、Spring はどのコンストラクターを使用するかについて混乱しているようです (ある意味では、両方のコンストラクターが最後のパラメーターとしてこれを持っているため、Spring が決定に使用するロジックと関係があるかどうか興味がありますどのコンストラクタを使用するか (とにかく...)。

Spring manualによると、要素に追加して<constructor-arg>、コンテナーが使用するコンストラクターを解決するのに役立つパラメーターがあります。

「タイプ」を追加できます:

<bean id="exampleBean" class="examples.ExampleBean">
  <constructor-arg type="int" value="7500000"/>
  <constructor-arg type="java.lang.String" value="42"/>
</bean>

または、インデックスを追加できます。

<bean id="exampleBean" class="examples.ExampleBean">
  <constructor-arg index="0" value="7500000"/>
  <constructor-arg index="1" value="42"/>
</bean>

(本当にしたい場合は、おそらく両方を指定できます)

これらのいずれかまたは両方を追加すると、Spring が使用するコンストラクターを解決するのに役立ちます。

当然の結果として、これが役に立たない場合は、XML 定義を変更して、Spring が使用しようとしている他のコンストラクターに必要なパラメーターを渡すことができますか?

ところで、WMD 内で引用タグを使用すると、質問が読みやすくなる場合があります。

于 2009-02-17T00:01:11.280 に答える
0

あなたはAlarmChannelクラスを管理していますか?もしそうなら、コンストラクターにprintステートメントを持つ新しいバージョンをロールできますか(初期化子try-catch内で使用しstaticて、クラスが初期化されている場所からスタックトレースを取得することもできます)?

そうすれば、重複するクラスが含まれているかどうかを知ることができます。

ClassLoaderまた、Spring構成ファイルで、を使用してを印刷することができますMethodInvokingFactoryBean-これはまた、問題にいくらかの光を当てるかもしれませんか?

于 2009-02-16T23:37:25.173 に答える
0

実際、そうだと思います。Jakarta オブジェクトに渡す最初のコンストラクター引数は abc.def.mdd.msg.alarm.huawei.MDDPackagerAlarmM2000 型ですが、ctor は文字列を必要とします。タイプを適切に一致させます。

ストレートなメッセージとして読めます。私は何が欠けていますか?

パッケージ構造から、それらがあなたのクラスであると仮定します。真実?

于 2009-02-16T23:23:54.910 に答える