Как проще всего обернуть хранимую процедуру в веб-службу?

У нас есть устаревшая система, содержащая ряд хранимых процедур, которые мы хотели бы предоставить другим приложениям в качестве веб-служб. Мы создаем веб-сервисы с JBoss. Хранимые процедуры могут выполняться из баз данных Oracle, DB2 или MS SQL Server.

В JDeveloper есть мастер для создания заглушек и их развертывания в файле ear, который будет работать на сервере приложений Oracle (OC4J). Мы находимся в процессе перехода на JBoss и используем Eclipse в качестве предпочтительной IDE.

Я бы предпочел использовать фреймворк, а затем перестраивать и поддерживать инфраструктуру самостоятельно. В идеале я хотел бы использовать библиотеку с открытым исходным кодом или инструмент / IDE JBoss для создания веб-службы на основе определения пула соединений и имени хранимой процедуры.

Каковы мои варианты?


person Kevin Williams    schedule 08.04.2009    source источник
comment
Я мог бы помочь вам, если бы вы были .Net... Windows Communication Foundation был бы идеальным для этого... вы в основном можете превратить любой существующий метод в веб-службу с помощью нескольких дополнений кода. Извините, я не мог помочь!   -  person hunter    schedule 08.04.2009
comment
Спасибо за информацию Хантер. Подобные продукты наводят меня на мысль, что должен существовать подходящий инструмент или библиотека Java, способная справиться с этим сценарием для JBoss.   -  person Kevin Williams    schedule 08.04.2009


Ответы (5)


Не уверен, что вы найдете именно то, что ищете, поэтому, если вы не можете написать что-то самостоятельно, вот две альтернативы:

  1. Используйте общий веб-сервис, который получит имя SP, параметры и вызовет процедуру. Это не очень удобно для вызывающей стороны и небезопасно для типов, но работу выполняет.

  2. Используйте двухэтапный подход. Первый шаг - оберните хранимую процедуру в класс Java (либо POJO, либо EJB). Второй шаг — представить класс как веб-службу с помощью Apache Axis2, который очень популярен, испытан и протестирован.

Быстрый поиск привел нас к этой структуре для упаковки SP в EJB, но я не тестировал это я сам. Кроме того, я думаю, что у некоторых производителей есть собственные инструменты для этой цели. Это гораздо более простой вопрос, конечно.

person zvikico    schedule 11.04.2009
comment
Звикико, спасибо за ссылку. Мы переходим с oc4j на Jboss. Я предполагаю, что фреймворк, на который вы ссылаетесь, является внешней версией оболочки, которую я пытаюсь заменить для JBoss. Ваш вариант 2 выглядит более вероятным, просто мне не кажется СУХИМ переконвертировать все эти СП раз-раз-раз-ов - person Kevin Williams; 14.04.2009
comment
Вариант 2 был подходом, на котором мы остановились. Спасибо за ответ. - person Kevin Williams; 18.04.2009

Если хранимые процедуры не были написаны с целью их непосредственного раскрытия как операций веб-службы, то их раскрытие может быть очень плохой идеей. Они могут делать предположения, которые не будут верны, если им позвонят напрямую.

Альтернативой является разработка внешнего API на основе требований. Если окажется, что лучший способ реализовать одну конкретную операцию — это вызвать хранимую процедуру, то сделайте это. Если окажется, что лучший способ реализовать все операции — это вызвать существующие хранимые процедуры, то вы были правы, и я только что потратил ваше время.

Но я думаю, что, вероятно, будут некоторые операции, которые не будут лучше всего реализованы путем прямого вызова существующих хранимых процедур.

person John Saunders    schedule 08.04.2009
comment
Спасибо за ваш отзыв. Это требование является частью проекта миграции JBoss, где эти процедуры уже представлены как веб-службы сервером приложений Oracle. Я бы предпочел отделить клиента от различных требований к БД (клиентские библиотеки, информация о подключении...), таким образом, используя веб-сервисы. - person Kevin Williams; 08.04.2009
comment
Дело в том, что независимо от того, как вы связаны с хранимыми процедурами, вы все равно связаны с деталями реализации. Я предлагаю вам не делать этого. - person John Saunders; 09.04.2009
comment
Но связь сводится к одной точке, обновляемой во время выполнения, вместо того, чтобы поддерживать версии клиентских jar-файлов и информацию о соединении для X клиентов, которые вызывают процедуру. - person Kevin Williams; 09.04.2009
comment
Это уменьшено; лучше бы убрали. - person John Saunders; 09.04.2009
comment
Я согласен, Джон, к сожалению, это часть устаревшей системы, которую я бы не хотел трогать. - person Kevin Williams; 18.04.2009

Возможно, вы захотите изучить использование EJB в этом контексте. Все контейнеры J2EE 1.4 должны поддерживать JSR 109, что позволяет открывать EJB. как веб-сервисы.

В частности, вы можете обернуть свои вызовы хранимых процедур внутри EJB-компонентов сеанса без сохранения состояния, а затем предоставить эти EJB-компоненты как веб-службы.

OC4J 10.1.3 и JBoss 4 поддерживают эту модель развертывания. Как и любой другой контейнер, совместимый с J2EE 1.4. Вам просто нужно найти вспомогательную документацию о том, как перенастроить (в отличие от перекодирования) приложение в этом контейнере.

person Vineet Reynolds    schedule 13.04.2009
comment
+1 Похоже, это может быть подход, который я собираюсь использовать. Если я не отмечу это как ответ, то только потому, что zvikico предложил что-то подобное в своем посте. - person Kevin Williams; 14.04.2009
comment
Аминь. Axis2 — неплохой выбор для меня, просто использование EJB в качестве веб-сервисов уменьшает объем кода, который необходимо поддерживать. - person Vineet Reynolds; 14.04.2009
comment
Еще раз спасибо за отзыв Винит - person Kevin Williams; 18.04.2009

Я нашел платформу с открытым исходным кодом (под лицензией Apache) под названием Data Services. из WS02. Кто-нибудь пробовал это? Есть какие-нибудь советы/подсказки/предупреждения?

person Kevin Williams    schedule 08.04.2009
comment
кажется слишком сложным и тяжелым для моих нужд. WS02 может быть хорошим инструментом для вас, если вы хотите управлять своими интерфейсами SOA. - person Kevin Williams; 14.04.2009

В JBoss самым простым способом предоставления доступа к этим службам будет использование сеансового компонента EJB3 без сохранения состояния. Используя эту модель, вы получаете доступ ко многим дополнительным функциям, которые могут быть полезны (объединение ресурсов, поддержка транзакций и т. д.).

@WebService
@SOAPBinding(style = Style.RPC)
public interface StoredProcedureWrapper extends Remote {
        String invokeStoredProc();
}

@Stateless
@WebService(endpointInterface = "path.to.StoredProcedureWrapper")
@Remote(StoredProcedureWrapper.class)
public class StoredProcedureWrapperBean {
        public String StoredProcedureWrapper() {
                // do business logic
                return "success";
        }
}
person Rich Kroll    schedule 16.04.2009
comment
Я, вероятно, пошел бы с этим решением, если бы знал о нем в то время. Спасибо за ответ - person Kevin Williams; 11.11.2009