Создание экземпляра драйвера Oracle приводит к исключению InvocationTargetException
-
06-09-2019 - |
Вопрос
У меня есть простой веб-сервис, который использует базу данных Oracle.Когда я тестирую службу внутренне, она работает нормально, однако вызов веб-службы через моего клиента (на том же компьютере, но в другом 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 решило эту проблему.
Решение
2 войны?Я полагаю, что ваш ojdbc.jar находится внутри WEB-INF / lib веб-службы WAR.
Возможно, ваша ВОЙНА находится внутри EAR, поэтому вам следует сослаться на драйвер в MANIFEST.MF.
Подробная информация: http://java.sun.com/j2ee/verified/packaging.html
Другие советы
Без дополнительной информации трудно представить конкретные предложения;Однако у меня был опыт работы с драйвером Oracle, который пытается подключиться через собственные библиотеки OCI, не может найти эти библиотеки, установленные в системе, и выдает исключение InvocationTargetException.Это все из очень смутных воспоминаний, так что ваш пробег почти наверняка будет отличаться.
Прошло некоторое время, но, если мне не изменяет память, у меня был случай, когда URL-адрес подключения был неправильно настроен, и OracleDriver (или одна из его оболочек) перебирала набор возможных методов подключения, пытаясь найти тот, который работал.В случае, если URL-адрес был настроен правильно, он никогда не доходил до попытки OCI (попытка метода тонкого подключения была первой), но если URL-адрес подключения был неправильно настроен, попытка тонкого подключения завершилась неудачей, вызвав попытку OCI, которая затем также завершилась неудачей, поскольку клиент OCI не был установлен на хосте (что привело к исключению InvocationTargetException).
Итак, некоторые вещи, которые нужно проверить:
- Действителен ли URL-адрес подключения?Если вы используете один и тот же URL-адрес подключения в обоих местах, вы уверены, что оба процесса привязаны к одному и тому же сетевому адаптеру?Если они привязаны к разным сетевым адаптерам, это может привести к сбоям в подключении даже на одном хосте.
- Одинакова ли среда в обоих случаях - если клиент OCI используется в вашей среде разработки, вероятно, существует несколько переменных среды, от которых он зависит.Если эти переменные среды не установлены идентично в среде, в которой запущен контейнер сервлета, я бы ожидал другого поведения.