Создание веб-сервиса и клиента с помощью JBossWS с использованием сложных объектов в качестве аргументов и возвращаемых типов

Я разрабатываю WebService и клиент для него, используя JBoss 5.1.0GA. Стек JBossWs уже был предустановлен с бинарником, который я скачал и как я понимаю это JBossWs 3.1.2GA

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

Веб-служба pojo, развернутая как военный файл.

@WebService
public class Service{
    @WebMethod
    public CompleObj getConfiguration() {
        CompleObj oConf = new CompleObj ();
        for (int i = 0; i < 10; i++) {
            NestObj oInst = new BOpRepoInstance("Val1", "Val2", "Val3", "Val4");
            oConf.addRepoInstance(oInst);
        }
        return oConf;
    }
}

Здесь,

CompleObj => — это сложный объект со списком типа NestObj. Его геттеры/сеттеры, toString и некоторые другие методы.

NextObj => имеет 4 переменные типа String. Его геттеры/сеттеры, toString, hashCode, equals и некоторые другие методы.

Эта веб-служба успешно развернута.

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

Теперь моя проблема в том, что когда eclipse сгенерировал заглушки для клиентов, он создал классы для CompleObj и NestObj. Эти классы имеют только переменные и их геттеры/сеттеры (это имеет смысл, поскольку они генерируются из документа WSDL). Таким образом, я теряю множество других методов, включая toString, hasCode, equals и т. д., которые я также хочу использовать на стороне клиента.

Теперь, как я могу напрямую использовать фактические файлы классов, определенные в проекте WebService, и избежать использования клиентом сгенерированных файлов. Я могу предоставить файлы классов в виде двоичного файла .jar для клиентского проекта, но я не могу понять, как этого добиться.

Другой вопрос: местоположение веб-службы встроено непосредственно в заглушки, что я могу сделать, чтобы местоположение веб-службы передавалось как часть аргумента в код вызова?


person Salman A. Kagzi    schedule 15.06.2012    source источник


Ответы (1)


  1. Классы, которые генерируются на стороне клиента, являются просто заполнителями, это не десерилизованная версия ваших собственных классов. Когда вы вызываете службу, она используется для переноса вашего объекта на сервер, тогда JBOOSWS выполнит сопоставление JAXB с фактическими классами. Таким образом, вы не можете создавать свои собственные классы для использования на стороне клиента, хотя они выглядят одинаково.

  2. URL-адрес будет зафиксирован в коде-заглушке, поскольку в eclipse при создании клиента WS первое, что вы должны указать, это URL-адрес WSDL, затем eclipse сгенерирует код клиента соответственно, поэтому сгенерированный код специфичен для предоставленного вами WSDL. Если вы хотите передавать WSDL динамически, вам потребуется собственный код для создания клиентских заглушек по переданному URL-адресу WSDL с использованием любой WSDLtoJAVA или любой другой утилиты.

person Murugesh    schedule 04.07.2012
comment
Спасибо. Я понимаю вышеупомянутые пункты, которые вы упомянули. Чтобы быть более точным в том, что я ищу, давайте возьмем пример веб-службы и создание ее клиента, как описано здесь. Теперь, в этом примере, если я упакую пользовательские типы данных, т. е. Customer.java и Discount*.java, в файл jar, как я могу заставить wsconsume использовать эти файлы вместо создания новых. В настоящее время я делаю следующее: после создания источника я удаляю созданные типы данных, а затем обновляю импорт, чтобы указать на те, которые доступны в файле Jar. - person Salman A. Kagzi; 16.07.2012
comment
Это связано с изменением предоставленной утилиты wsconsume, для этого нам нужно посмотреть реализацию wsconsume. - person Murugesh; 19.07.2012