AXIS Client v.s. Сервис AXIS2 - PullRequest
       86

AXIS Client v.s. Сервис AXIS2

2 голосов
/ 16 марта 2012

Я должен реализовать клиент AXIS 1.4, который использует метод AXIS2 1.4. Клиент AXIS 1.4 сделан путем создания заглушек. Клиент отправляет запрос и возвращает ответ от сервиса с некоторым вложением (MTOM). Когда я вызываю метод (операцию) объектом типа порта AXIS 1.4, я получаю сообщение об ошибке:

org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.

Я думаю, что MTOM испортил AXIS. Итак, вот вопрос: как я получил вложение, которое мне вернул веб-сервис AXIS2 1.4 (MTOM)? ТИА.

Francesco

P.S .: вот код. Есть заглушки, сгенерированные WSDL. Проблема заключается в следующем: я получаю исключение при вызове метода заглушки порта. В сообщении, которое я получаю, есть вложения.

String codistat = "CODISTAT";    
OrdinanzeViabilitaLocator ovlocretreive = new OrdinanzeViabilitaLocator();
ovlocretreive.setOrdinanzeViabilitaHttpSoap11EndpointEndpointAddress(".. the service url + action..");
try {
  OrdinanzeViabilitaPortType ovretreive = ovlocretreive.getOrdinanzeViabilitaHttpSoap11Endpoint();
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.USERNAME_PROPERTY, "username");
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.PASSWORD_PROPERTY, "password");            
  //problems began here
  MessageReqOrdinanze mrq = new MessageReqOrdinanze();
  mrq.setCodistat(codistat);
  Calendar date_from = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  Calendar date_to = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  mrq.setDate_from(date_from);
  mrq.setDate_to(date_to);
  // the next line generate the exception
  MessageOrdinanze mretreive = ovretreive.getOrdinanze(mrq);
  } catch (AxisFault e) {
        e.printStackTrace();
  } catch (RemoteException e) {
        e.printStackTrace();
  } catch (FileNotFoundException e) {
        e.printStackTrace();
  } catch (IOException e) {
        e.printStackTrace();
  } catch (ServiceException e) {
        e.printStackTrace();
  }

Сообщение, которое я получаю, имеет

<xop:include href="cid... >...< ../xop/include"/>

тег внутри, это MTOM (я думаю, это вызывает исключение). Надеюсь, это поможет.

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Для работы MTOM на стороне клиента необходимо сделать две вещи:

  1. Убедитесь, что в заглушках тип xs:base64Binary сопоставлен с java.activation.DataHandler вместо byte[].
  2. Настройка отображения типов (во время выполнения) для xs:base64Binary и java.activation.DataHandler, использующих JAFDataHandlerSerializer и JAFDataHandlerDeserializer (поддерживающих MTOM).

Вторая часть довольно проста.Просто настройте файл client-config.wsdd со следующим отображением типа:

<typeMapping languageSpecificType="java:javax.activation.DataHandler" qname="xs:base64Binary"
             deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
             serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" 
             encodingStyle=""/>

Первая часть более сложная, поскольку инструментарий (wsdl2java) в Axis 1.4 не поддерживает изменение типа Java, связанного с даннымТип XML.Есть несколько способов обойти это ограничение:

  • Отредактируйте созданные заглушки вручную и измените byte[] на javax.activation.DataHandler.В зависимости от того, как вы управляете сгенерированным кодом в вашем проекте, это может быть или не быть приемлемым решением.
  • Возможно (хотя я не проверял это) обмануть wsdl2java в использовании javax.activation.DataHandler, давэто модифицированный WSDL, в котором тип {http://www.w3.org/2001/XMLSchema}base64Binary заменен на {java} javax.activation.DataHandler.
  • Я исправил инструмент в текущей магистрали Axis, чтобы он поддерживал этот тип конфигурации.Однако обратите внимание, что это реализовано только в плагине wsdl2java Maven (но не в задаче Ant или инструменте командной строки).Вы можете использовать версию этого плагина 1.4.1-SNAPSHOT;сгенерированный код будет по-прежнему работать с Axis 1.4.Вы можете найти документацию здесь .
0 голосов
/ 02 марта 2016

Над решением отлично.Тем не менее, тем, кто может изо всех сил пытаться сделать приведенный выше фрагмент кода, используйте xmlns:xs="http://www.w3.org/2001/XMLSchema", тогда только данный typeMapping работает

<typeMapping qname="xs:base64Binary" languageSpecificType="java:javax.activation.DataHandler"
deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
    serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" encodingStyle="" />
...