JNDI ClassCastException - PullRequest
       6

JNDI ClassCastException

0 голосов
/ 18 января 2011

Я пытаюсь использовать JNDI с пользовательским источником данных под названием CEDataSource.Из моего понимания, чтобы это работало, мне нужно было бы также создать собственную фабрику.

Итак, я создал собственную фабрику, которая будет возвращать объект CEDataSource, но теперь, когда я пытаюсь использовать это в Java с

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

, я получаю исключение ClassCastException "CEDataSource не может быть сопоставлен с CEDataSource».Я добавил CEDataSource и CEDataSourceFactory в папку TOMCAT / lib, а также сослался на этот же файл в развернутом приложении.

Любая помощь будет принята с благодарностью за причину возникновения этой возможной ошибки.Спасибо

Ответы [ 3 ]

4 голосов
/ 18 января 2011

«CEDataSource не может быть сопоставлен с CEDataSource», по-видимому, указывает на тот факт, что это не тот же «CEDataSource» в обоих местах.

Что может отличаться - это загрузчик классов, и это обычно происходит, если у вас одинаковые jars / .class (s) в нескольких местах.

У вас есть несколько копий вашей банки? Попробуйте получить одну копию, возможно, в общей библиотеке Tomcat, чтобы она загружалась одним и тем же загрузчиком классов независимо от того, откуда вы к ней обращаетесь.

0 голосов
/ 18 января 2011
CEDataSource ds = (CEDataSource)envCtx.lookup("jdbc/cePu");

Поиск, который вы выполняете на jdbc/cePu, не относится к типу класса CEDataSource , он относится к другому типу класса, поэтому вы получаете исключение приведения класса.если бы вы могли показать мне конфигурацию для jdbc / cePu , это было бы полезно.

0 голосов
/ 18 января 2011

На самом деле не так уж сложно запустить Tomcat в сеансе отладки Eclipse (просто поместите все Bootstrap.jar в проект и добавьте системные свойства в параметры JVM). Я сделал это много раз, хотя бы для того, чтобы вскрыть кишки этого кошачьего. Как только это будет сделано, вы можете прервать исключение приведения класса к фабрике соединений JNDI, и тогда вы сможете увидеть, вызывается ваша фабрика или нет.

Из того, что я помню, Tomcat использует источник данных DBCP. На самом деле переупаковано в com.apache.tomcat.dbcp.dbcp.DataSource (IIRC).

Так что я не удивлюсь, если это то, что вы получите в результате своего поиска.

Оглядываясь назад, теперь я понимаю, что также забыл упомянуть, что если какой-либо базовый класс (например, драйвер JDBC), необходимый для создания экземпляра вашего CEDataSource, отсутствует, вы также получаете это ClassCastException. Справедливо, но вы всегда сосредотачиваетесь на самом классе, а не на других банках ...

...