Возможно, это ваш 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 загрузчиков классов на работе здесь. Я забыл упомянуть о третьем подходе.
- Предпочитаете: удалите файл jar, который поставляет DelegatingConnection из вашего военного файла, и полагайтесь на то, что он предоставляется загрузчиком классов common/lib.
- запустить свой код в общем/Lib загрузчика классов, поместив войну там
- отражают: вероятно, плохо, вероятно, дадут проблемы с трансляцией объекта результата к правому классу
я использовал этот '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 \ –
да, это похоже на 2 разных загрузчика классов. первый из них - загрузчик классов вашего контейнера, второй - его родительский, общий/класс, который разделяют все военные файлы. – Joeblade
, вы можете исправить это, не поставляя файл/файл файла jar в WEB-INF/classes и только используя тот, который уже поставляется в общих/классах. Если вы можете определить конкретный файл jar, который вы поставляете _and_, присутствует в общих/lib/common/classes, вы можете исключить его из своего военного файла, надеюсь, – Joeblade