2011-01-18 10 views
0

CEDataSourceというカスタムデータソースでJNDIを使用しようとしています。これを私が理解することから、カスタムファクトリを作成する必要があります。JNDI ClassCastException

だから私はCEDataSourceオブジェクトを返すカスタムファクトリーを作成したが、私は

Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
// Look up our data source 
    CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu"); 

とJavaでこれを使用しようとすると、今、私は例外ClassCastExceptionが は「CEDataSourceがCEDataSourceにマッピングすることができません」を取得。私はCEDataSourceとCEDataSourceFactoryをTOMCAT/libフォルダに追加しました。私の展開したアプリケーションでこの同じjarファイルを参照しました。

この可能性のあるエラーが発生する可能性がある場合は、何か助けていただければ幸いです。ありがとう

+0

コードが正しいようです。 context.xmlを表示することができます。 –

答えて

4

"CEDataSourceはCEDataSourceにマップできません"というのは、両方の場所で同じ "CEDataSource"ではないということを指しているようです。

何が違うかはクラスローダーで、これは通常、複数の場所に同じjars/.class(es)がある場合に発生します。

あなたの瓶のコピーは複数ありますか? 1つのコピーを、おそらく共有のtomcatのlibに入れて、同じクラスローダーによってアクセスされた場所からでも読み込まれるようにしてください。

+0

異なるクラスローダーから来た同じクラスは、実際には同じクラスではなく、キャスターに割り当てることができません。通常は、このようなカスタムクラスをサーバー全体のクラスローダーに配置し、アプリケーションがそのクラスに委譲するようにする必要があります(一部の環境では扱いにくい可能性があります) –

0

EclipseデバッグセッションでTomcatを起動するのは難しくありません(すべてのBootstrap.jarをプロジェクトに入れ、JVMパラメータにSystemプロパティを追加するだけです)。私はその猫の腸を解剖するだけで何度もやった。これが完了すると、JNDI接続ファクトリのクラスキャスト例外を破ることができ、ファクトリが呼び出されたかどうかを確認することができます。

TomcatはDBCPデータソースを使用しています。実際にはcom.apache.tomcat.dbcp.dbcp.DataSource(IIRC)の下で再パッケージ化されています。

これがルックアップの結果として終わるのであれば、私は驚くことはありません。

私は、CEDataSourceのインスタンスを作成するために必要な基本クラス(たとえばJDBCドライバ)が見つからない場合、このClassCastExceptionも取得することを忘れていました。十分なフェアが、あなたは常に他のjarファイルにクラス自体に焦点を当てていない...あなたがjdbc/cePu上でやっている

0
CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu"); 

検索はクラス型CEDataSourceではない、それはいくつかの他のクラス型に属し、 、それがクラスキャストの例外を取得している理由です。 jdbc/cePuの設定を参考にすれば助かります。