2014-11-10 1 views
0

conn= Ds.getConnection(); Connection oraconn = ((DelegatingConnection)conn).getInnermostDelegate();

его даянию следующего исключения java.lang.ClassCastException: org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to org.apache.commons.dbcp.DelegatingConnection

Я также установить параметр ресурса accessToUnderlyingConnectionAllowed=true необходимо unwrapp этого объекта перейдите к ArrayDescriptor в server.xml tomcat , пожалуйста, помогите thanx заранее

ответ

0

Возможно, это ваш org.apache.commons.dbcp.Delegat ingConnection - это другой класс (другой загрузчик классов), чем org.apache.commons.dbcp.DelegatingConnection из соединения.

это может быть, если вы поставляете этот класс через свой военный файл, связанный с контейнером, и соединение создается через tomcat (или другой сервер приложений).

, чтобы проверить это, вы можете использовать что-то вроде:

Class.forName("org.apache.commons.dbcp.DelegatingConnection").getClassLoader().toString() 
conn.getClassLoader().toString(); 

вы могли бы использовать ВЗ отражение. это от подобной question:

// 'source' is from another classloader 
Method method = conn.getClass().getMethod("getInnermostDelegate", new Class[] {}); 
Object o = method.invoke(conn, new Object[] {}); 

Однако, я не уверен, что возвращение аргумент легко литьевой к классу в текущем загрузчиком классов. Если вы следуете методу отражения, убедитесь, что вы инкапсулируете все это в один класс, не позволяйте таким вещам, как «Метод и объект», отказаться от этого. Я не рекомендую этого, но он должен работать.

альтернативой является размещение вашего кода в том же месте, что и соединение. (tomcat lib)

Конечно, сначала проверьте, действительно ли вы используете 2 разных загрузчика классов для своего кода. : D

EDIT:

От комментариев он выглядит как есть 2 загрузчиков классов на работе здесь. Я забыл упомянуть о третьем подходе.

  1. Предпочитаете: удалите файл jar, который поставляет DelegatingConnection из вашего военного файла, и полагайтесь на то, что он предоставляется загрузчиком классов common/lib.
  2. запустить свой код в общем/Lib загрузчика классов, поместив войну там
  3. отражают: вероятно, плохо, вероятно, дадут проблемы с трансляцией объекта результата к правому классу
+0

я использовал этот 'SYSOUT (" 1 ..) "+ Class.forName (" org.apache.commons.dbcp.DelegatingConnection ") getClassLoader() ToString()); conn = ds.getConnection(); .. SYSOUT ("2)" + conn.getClass() getClassLoader() ToString()); 'О. П. 1) WebappClassLoader делегат: ложные хранилищами: /WEB-INF/классы/ ------ ----> родительский загрузчик: StandardClassLoader делегата: истинные хранилищ: файл: D: \ Apache Software Foundation \ Tomcat 5.0 \ Shared \ Classes \ -2) StandardClassLoader делегат: истинные хранилищ: файл: D: \ Apache Software Foundation \ Tomcat 5.0 \ common \ classes \ –

+0

да, это похоже на 2 разных загрузчика классов. первый из них - загрузчик классов вашего контейнера, второй - его родительский, общий/класс, который разделяют все военные файлы. – Joeblade

+0

, вы можете исправить это, не поставляя файл/файл файла jar в WEB-INF/classes и только используя тот, который уже поставляется в общих/классах. Если вы можете определить конкретный файл jar, который вы поставляете _and_, присутствует в общих/lib/common/classes, вы можете исключить его из своего военного файла, надеюсь, – Joeblade

Смежные вопросы