ClassCastException - oracle.jdbc.OraclePreparedStatement - PullRequest
5 голосов
/ 04 августа 2011

Я столкнулся с обостряющейся проблемой, вот факты -

Я регистрирую специфический возвращаемый параметр и для этого я преобразую java.sql.PreparedStatement в oracle.jdbc.OraclePreparedStatement.

((OraclePreparedStatement) getStatement())
    .registerReturnParameter(index, sqlType);   

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

oracle.jdbc.driver.OraclePreparedStatementWrapper cannot be cast
 to oracle.jdbc.OraclePreparedStatement

Это невероятно странная ошибка для меня, потому что я уверен, что OraclePreparedStatement можно назначить из getStatement ().Я отладил и обнаружил, что это ИСТИНА для всех сред:

//class oracle.jdbc.driver.OraclePreparedStatementWrapper
getStatement().getClass();

ЛОКАЛЬНЫЕ и среды DEV используют оба источника данных, которые я настроил в META-INF / context.xml:

<Resource name="dataSource/dbsubm" auth="Container"
    type="oracle.jdbc.xa.client.OracleXADataSource"
    factory="org.apache.naming.factory.BeanFactory"
    user="*****" password="******"
    URL="jdbc:oracle:thin:@host:port:db" />

Среда TEST отличается тем, что в ней имеется DataSource из server.xml, хотя конфигурация точно такая же.Для меня это единственная разница между этими средами.

В чем может быть проблема?Почему я получаю ClassCastException, используя тот же код, но в разных средах?Используя getClass (), я могу сказать, что они все одного типа ... пожалуйста, помогите!

1 Ответ

8 голосов
/ 04 августа 2011

A ClassCastException может произойти, если приведение пересекает границы загрузчика классов. Например, если класс возвращаемого объекта оператора был загружен загрузчиком классов, отличным от того, который загружал OraclePreparedStatemen в вашем коде. Это может быть вызвано наличием двух отдельных копий JDBC-файла в двух местах, одна из которых используется вашим контейнером Java EE (Tomcat? WAS?), А другая - вашим кодом.

...