Создание экземпляра драйвера Oracle приводит к исключению InvocationTargetException

У меня есть простой веб-сервис, использующий базу данных оракула. Когда я тестирую службу изнутри, она работает нормально, однако вызов веб-службы через мой клиент (на том же компьютере, но в другой WAR) вызывает invocationtargetexception. Наконец-то я обнаружил, что это проблема с созданием экземпляра OracleDriver. Он вообще не вызывает никаких исключений, поэтому я не могу понять, в чем ошибка.

Google только предоставил решение с использованием oracle.jdbc.driver.OracleDriver вместо oracle.jdbc.OracleDriver, но это, похоже, ничего не исправляет. Я использую jar-файл ojdbc14.jar, и, насколько я могу судить, он правильно включен в путь к классу для веб-службы ... поскольку он работает, когда я тестирую службу с помощью простого основного метода.

РЕДАКТИРОВАТЬ: InvocationTargetException генерируется AxisFault с сервера Axis. Invocationtargetexception - это класс-оболочка, и мои попытки извлечь исключение с помощью .getCause () всегда возвращают null.

Я развертываю службу с помощью jboss и включаю файл JAR драйвера в библиотеку для источника, но не для сервера. Включение драйвера в / jboss / server / default / lib разрешило это.


person ravun    schedule 26.05.2009    source источник
comment
вы можете опубликовать полное исключение?   -  person Pablo Santa Cruz    schedule 26.05.2009
comment
В частности, какое исключение вызвало исключение.   -  person Tom Hawtin - tackline    schedule 26.05.2009
comment
В вопросе говорится, что он не генерирует исключение, но InvocationTargetException - это исключение, которое явно было создано. Более подробная информация об исключении определенно будет полезна - см. Мой ответ ниже, чтобы получить общее предположение, которое, вероятно, недостаточно информировано, чтобы действительно помочь.   -  person Jared    schedule 26.05.2009


Ответы (2)


2 ВОЙНЫ? Я предполагаю, что ваш ojdbc.jar находится внутри WEB-INF / lib WAR веб-службы.

Возможно, ваша WAR находится внутри EAR, поэтому вам следует ссылаться на драйвер в MANIFEST.MF.

Дополнительная информация: http://java.sun.com/j2ee/verified/packaging.html

person ATorras    schedule 26.05.2009
comment
Да, я имел в виду два разных EAR. Я пишу как веб-сервис, так и клиент. Придется заглянуть в МАНИФЕСТ; Я смотрел на это, но никогда толком не знал, что он делает. - person ravun; 27.05.2009

Без дополнительной информации трудно дать конкретные предложения; Однако у меня был опыт работы с драйвером Oracle, который пытается подключиться через собственные библиотеки OCI, не может найти эти библиотеки, установленные в системе, и выдает исключение InvocationTargetException. Это все из очень смутной памяти, поэтому ваш опыт почти наверняка будет разным.

Прошло некоторое время, но если память мне не изменяет, у меня был случай, когда URL-адрес подключения был неправильно настроен, и OracleDriver (или одна из его оболочек) перебирал набор возможных методов подключения, пытаясь найти тот, который работал. В случае, если URL-адрес был настроен правильно, он так и не попал в попытку OCI (попытка метода тонкого подключения была первой), но если URL-адрес подключения был неправильно настроен, тонкая попытка завершится неудачно, что приведет к попытке OCI, которая затем также не удалась. потому что клиент OCI не был установлен на хосте (что привело к исключению InvocationTargetException.)

Итак, кое-что проверить:

  1. Действителен ли URL-адрес подключения? Если вы используете один и тот же URL-адрес подключения в обоих местах, уверены ли вы, что оба процесса привязаны к одному и тому же сетевому адаптеру? Если они привязаны к разным сетевым адаптерам, это может вызвать странности подключения даже на одном и том же хосте.
  2. Одинакова ли среда в обоих случаях - если клиент OCI начинает использоваться в вашей среде разработки, вероятно, существует несколько переменных среды, от которых он зависит. Если эти переменные среды не установлены одинаково в среде, в которой работает контейнер сервлетов, я бы ожидал другого поведения.
person Jared    schedule 26.05.2009