Как использовать WSDL, который определяет перегруженные функции, используя Groovy или Ruby? - PullRequest
0 голосов
/ 26 мая 2011

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

Это создает проблемы при попытке использовать WSDL из других языков (особенно языков, которые плохо справляются с перегрузкой или вообще). Например:

  • Groovy's WSClient сразу выходит из строя во время инициализации:

    java.lang.IllegalArgumentException: An operation with name
    [{http://example.com/service-v1}overloadedFunction]
    already exists in this service
    
  • Ruby's wsdlDriver не сразу завершается с ошибкой, но вызывается только одна версия определений перегруженных функций (остальные кажутся непригодными).

Если я не могу изменить службу, есть ли хороший способ справиться с этим? Возможно, есть опция для этих клиентских библиотек SOAP, разных библиотек или устоявшегося преобразования WSDL?

1 Ответ

2 голосов
/ 27 мая 2011

Генезис / переформулировка проблемы:

Проблема заключается в создании прокси на стороне потребителя для связи с веб-службой через SOAP, где WSDL не использует профиль WS-I Basic, в частностивыставляя операции с тем же именем под тем же PortType.

Обращаясь к специально упомянутым генераторам клиентов:

  • WSClient Groovy явно указывает для обзора модуля:

    «Если вам нужно быстро использовать и / или публиковать веб-службы, совместимые с WS-I, GroovyWS может помочь вам».

  • Язык Ruby позволяет классам иметь методы с одинаковыми именами, но последний определенный является единственным, который исполняющая среда когда-либо выполнит.

Опции:

  1. Создать посредника:

    Используя язык, который (легко) поддерживает создание клиентских прокси для перегруженных операций PortType, создайтеновый веб-сервис, которыйh предоставляет службы совместимым образом WS-I Basic Profile и передает запросы обратно в исходную службу.Это является проявлением шаблона адаптера.

    • Плюсы: этот адаптер будет обслуживать любого потребителя, способного генерировать прокси для WS-I Basic Profile совместимых WSDL с.Кроме того, если служба провайдера изменится, вы сможете изменить посредническую услугу, не меняя интерфейсы службы, которые она предоставляет вашим потребляющим программам.
    • Минусы: вам потребуется настроить собственный сервер для веб-служб.
  2. Изменить сгенерированный код:

    Это отличное решение для проблемы Ruby wsdlDriver, поскольку прокси-генератор успешно генерируетпрокси-метод для каждой операции.Все, что вам нужно сделать, это изменить имена методов в классе Ruby на уникальные.

    • Плюсы: очень просто.
    • Минусы: применяется только к подмножеству генераторов клиентовтипа Ruby х wsdlDriver.Кроме того, прокси необходимо будет редактировать каждый раз при их регенерации.
  3. Дайте клиентским генераторам измененные WSDL:

    Загрузите WSDL и измените его вручную, чтобы отобразить только определение нужной операции, или переименуйте операции, чтобы они имели уникальные имена (измените MyOp, MyOp, MyOp -> MyOp1, MyOp2, MyOp3).Вам почти наверняка понадобится изменить сгенерированный код.

    • Плюсы: простота.
    • Минусы: Если у вас есть большое или постоянно меняющееся количество WSDL документов для обработки, это может занять много времени.Кроме того, прокси нужно будет редактировать каждый раз при их регенерации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...