1

Geometry というカスタム データ タイプを使用する Kettle ステップがあります。最初の行からメタ情報を取得する次のコード行があります。

geometryInterface = data.prevRowMeta.getValueMeta(meta.getGeomSelectedCol());

そして、次のようにして Geometry 値を取得します。

geometry = ((ValueMetaGeometry)geometryInterface).getGeometry(r[meta.getGeomSelectedCol()]);

ステップを実行すると、次の例外が発生します。

 java.lang.ClassCastException: org.pentaho.di.core.row.value.ValueMetaGeometry cannot be cast to org.pentaho.di.core.row.value.ValueMetaGeometry

ここで、ValueMetaGeometry はカスタム データ型です。クラスローダーの問題だと思います。同じことに関するあなたの意見をいただければ幸いです。

4

2 に答える 2

2

はい、クラスローダーの問題です。これは、2 つの異なるプラグインが同じクラス (各プラグインに 1 つずつ重複する JAR) を読み込んで使用しようとした後、互いに通信しようとした場合、または 2 つのクラスが異なるクラスローダーから ValueMetaGeometry クラスを解決しようとした場合に発生する可能性があります。後者のケースは、クラスが親クラスローダにロードされ (たとえば、JAR が data-integration/lib にある場合)、プラグイン クラスによってもロードされた場合 (JAR がプラグインの lib/ フォルダにある場合) に発生する可能性があります。プラグイン クラスはプラグインのクラスローダーでそれを見つけ、他のコンシューマーは親クラスローダーで ValueMetaGeometry クラスを見つけます。

問題を解決するには、変換と手順について詳しく知る必要がありますが、考えられる解決策の 1 つは、PluginRegistry を使用して ValueMetaGeometry クラスを取得し、スレッド コンテキスト クラスローダーを ValueMetaGeometry.class.getClassLoader() に設定することです。また、リフレクションを使用して ValueMetaGeometry オブジェクトのメソッドを呼び出すこともできます。

通常、この種の問題が発生するのはスクリプトの手順であることに注意してください。私のアドバイスは、ValueMetaGeometry メソッドを内部で使用するステップ プラグインを作成することですが、他のコア Kettle データ型 (String、Integer など) を生成することです。たとえば、ValueMetaMap タイプと、Fields to Map および Map to Fields のステップ プラグインがあります。

https://github.com/mattyb149/pdi-valuemeta-map

この手順では、ValueMetaMap クラスの使用を、それに「話しかける」ことができるプラグインにブラックボックス化しています。

于 2014-12-30T16:40:00.060 に答える
1

それは確かにクラスローダーの問題でした。ステップがリフレクションを使用してロードされている間、データ型はコア ディストリビューションにありました。データ型コードをステップ コードに取り込むと、正常に機能しました。

于 2014-12-30T16:21:07.710 に答える