Отображение типов из двух WSDL в один класс Java - PullRequest
0 голосов
/ 05 сентября 2011

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

Я обнаружил, что в двух wsdl много совпадений, но используемые имена разные. Например, при возникновении ошибки обе службы возвращают список сообщений об ошибках. Но две службы используют разные имена для возвращаемых списков. Смотрите два подраздела wsdl's

  .
  .
  <s:element name="LoadResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="LoadResult" type="tns:ArrayOfMessageOfHierarchyLoadMessage" />
        <s:element minOccurs="0" maxOccurs="1" name="hierarchy" type="tns:Hierarchy" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="ArrayOfHierarchyLoadMessage">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="HierarchyLoadMessage" nillable="true" type="tns:HierarchyLoadMessage" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="HierarchyLoadMessage">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="Type" type="tns:MessageType" />
      <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" />
      <s:element minOccurs="0" maxOccurs="1" name="Parameters" type="tns:ArrayOfString" />
    </s:sequence>
  </s:complexType>
  .
  .

и подраздел другого wsdl

  .
  .
  <s:element name="SearchResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SearchResult" type="tns:ArrayOfMessageOfErrorCodes" />
        <s:element minOccurs="0" maxOccurs="1" name="data" type="tns:FinderData" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="ArrayOfErrorCodes">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="unbounded" name="ErrorCodes" nillable="true" type="tns:ErrorCodes" />
    </s:sequence>
  </s:complexType>
  <s:complexType name="ErrorCodes">
    <s:sequence>
      <s:element minOccurs="1" maxOccurs="1" name="Type" type="tns:MessageType" />
      <s:element minOccurs="0" maxOccurs="1" name="Text" type="s:string" />
      <s:element minOccurs="0" maxOccurs="1" name="Parameters" type="tns:ArrayOfString" />
    </s:sequence>
  </s:complexType>
  .
  .

Как видите, перекрывающиеся типы

ArrayOfMessageOfHierarchyLoadMessage and ArrayOfMessageOfHierarchyLoadMessage
MessageOfHierarchyLoadMessage and MessageOfErrorCodes

Можете ли вы сказать мне, если возможно, используя файлы привязки, отобразить идентичные типы в двух wsdl, такой wsimport сгенерирует только один класс java для него?

1 Ответ

0 голосов
/ 05 сентября 2011

Вопрос, который вам нужно задать себе: это хорошая идея, чтобы иметь только один класс, который применяется к двум различным веб-сервисам? Если у вас есть один класс, что произойдет, если одна из компаний изменит свой сервис. Вы должны не только изменить интерфейс к их ws, но и интерфейс второй компании.

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

Вы, наверное, уже думали об этом, но я бы использовал шаблон адаптера. Таким образом, у вас будет три класса: универсальный класс (GenericErrorList), используемый повсюду в вашем коде; и два, которые генерируются из соответствующих wsdls (CompanyOneErrorList и CompanyTwoErrorList). Существует метод преобразования, который принимает CompanyOneErrorList и создает GenericErrorList. То же самое для другой компании.

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

...