Конфликт пространства имен jax-ws веб-служб SharePoint - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь использовать веб-службу SharePoint для получения изменений в списке, но, похоже, существует конфликт пространства имен между тем, что генерирует клиент jax-ws, и тем, что принимает SharePoint.Ниже приведен xml, сгенерированный jax-ws.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <GetListItemChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <listName>Documents</listName>
      <viewFields>
        <FieldRef Name="Modified"/>
        <FieldRef Name="_CheckinComment"/>
        <FieldRef Name="Title"/>
        <FieldRef Name="Created"/>
      </viewFields>
      <since>1970-01-01T00:00:00</since>
      <contains/>
    </GetListItemChanges>
  </S:Body>
</S:Envelope>

Мне нужно удалить xmlns = "http://schemas.microsoft.com/sharepoint/soap/" из GetListItemChanges. Я пробовал следующее (и различные варианты), но изменения кажутсяигнорируется. xmlns удаляется при отладке, но выходной xml не изменяется.

public class SharePointSoapHandler implements SOAPHandler<SOAPMessageContext> {
  ...
 @Override
  public boolean handleMessage(SOAPMessageContext p_soapMessageContext) {
    try {
      SOAPMessage l_soapMessage = p_soapMessageContext.getMessage();
      l_soapMessage.getSOAPBody().getFirstChild().getAttributes().removeNamedItem("xmlns");
      l_soapMessage.saveChanges();
      ByteArrayOutputStream l_outputStream = new ByteArrayOutputStream();
      l_soapMessage.writeTo(l_outputStream);
      m_logger.info(new String(l_outputStream.toByteArray()));
    } catch (Exception ex) {
      m_logger.error("Soap exception modifying xml for request", ex);
    }
    return true;
  }
}

Я что-то упустил? Есть ли лучший способ сделать это или мне нужно сгенерировать xml вручную?

РЕДАКТИРОВАТЬ: действительный запрос мыла с использованием soap ui. Jax-ws удаляет второй префикс и перемещает атрибут xmlns.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.microsoft.com/sharepoint/soap/">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:GetListItemChanges>
         <!--Optional:-->
         <soap:listName>Shared Documents</soap:listName>
         ...
         <soap:since>2012-02-15T00:00:00</soap:since>

      </soap:GetListItemChanges>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

1 голос
/ 20 апреля 2012

См. Изменение префикса пространства имен XML по умолчанию, сгенерированного с помощью JAXWS для использования обработчика для перехвата мыла и изменения его при необходимости;также полезный метод для отладки мыла при отправке по проводам.

Вы также можете установить объявления пространства имен в заголовке мыла следующим образом:

SOAPMessage request = factory.createMessage();
SOAPEnvelope envelope = request.getSOAPPart().getEnvelope();
envelope.addNamespaceDeclaration("uri", "uri:foo.bar.com");
request.saveChanges();

, а затем создайте элементы с префиксом пространства имен, например:

SOAPBody body = request.getSOAPBody();
SOAPElement ping = body.addChildElement("foo", "uri");

без предварительной установки объявления в заголовке добавление элемента с префиксом завершится неудачей.

выполнение таких действий кажется обходящим то, что объявление пространства имен зависает от узлов тела, что нарушало то, что я пытался сделать.

вот мой тест jUnit, который я использовал для проверки этой работы:

public void testPing() throws Exception {

String endpoint = "http://www.foo.bar/ws/someWebservice";
QName port = new QName(endpoint, "uri");
QName serviceName = new QName(endpoint, "someWebserviceMethod");

Service service = Service.create(serviceName);
service.setHandlerResolver(new MyHandlerResolver());
service.addPort(port, SOAPBinding.SOAP11HTTP_BINDING, endpoint);

Dispatch<SOAPMessage> dispatch = service.createDispatch(port, SOAPMessage.class, Service.Mode.MESSAGE);
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage request = factory.createMessage();

SOAPEnvelope envelope = request.getSOAPPart().getEnvelope();
envelope.addNamespaceDeclaration("uri", "uri:bar.foo");
request.saveChanges();

SOAPBody body = request.getSOAPBody();

SOAPElement element = body.addChildElement("someRequestElement", "uri");
SOAPElement child = ping.addChildElement("someRequestChild");

SOAPElement text_node = child.addChildElement("someTextNode");
messageType.addTextNode("test text");

request.saveChanges();

System.out.println();
request.writeTo(System.out);
System.out.println();

Object o = dispatch.invoke(request);

System.out.println("ret: " + o.toString());

assertNotNull( o );

}

...