Получение ответа «элемент не объявлен» от вызова веб-службы - PullRequest
0 голосов
/ 30 января 2012

Я использую веб-сервис SOAP в стиле документа. Он работает с интерфейсом SOAP, но я получаю сообщение об ошибке, пытаясь вызвать его программно.

Вот ошибка, которую я получаю с сервера:

<SubmitRequestDocResponse xmlns="http://tripauthority.com/hotel">
  <SubmitRequestDocResult>
    <ArnResponse xmlns:ns2="http://tripauthority.com/hotel" xmlns="">
      <Error>
        <Message>
               Request is not valid. Details: The 
              'http://tripauthority.com/hotel:ArnRequest' 
               element is not declared.
        </Message>
      </Error>
    </ArnResponse>
  </SubmitRequestDocResult>
</SubmitRequestDocResponse>

Код, вызывающий его, выглядит так:

ARequestDoc requestDoc = objectFactory.createSubmitRequestDocARequestDoc();
ArnRequest request = requestFactory.createArnRequest();
requestDoc.getContent().add(request);
SubmitRequestDocResult response = 
    soap.submitRequestDoc("id", "username", "password", requestDoc);

И используемые классы организованы и аннотированы:

пакет com.company.server.ws:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "siteID",
    "aUserName",
    "aPassword",
    "aRequestDoc"
})
@XmlRootElement(name = "SubmitRequestDoc")
@XmlSeeAlso(ArnRequest.class)
public class SubmitRequestDoc { // Stuff... }


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "content"
})
public static class ARequestDoc { // Stuff ... }

пакет com.company.server.ws.request:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "availability",
    "rateDetails",
    "reservation",
    "cancellation"
})
@XmlRootElement(name = "ArnRequest")
public class ArnRequest { // Stuff ... }

Кроме того, com.company.server.ws имеет следующее package-info.java:

@javax.xml.bind.annotation.XmlSchema(
        namespace = "http://tripauthority.com/hotel", 
        elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.company.server.ws;

Кроме того, за все это стоит WSDL и XSD для запроса

Кто-нибудь знает, что я могу сделать, чтобы правильно отправить это сообщение? Я могу отправить жестко закодированный запрос строки, используя SOAP UI, и он работает просто отлично.

Спасибо

Редактировать Что бы это ни стоило, до сих пор я догадывался, что это могло бы пройти, если бы я мог каким-то образом отправить часть ArnRequest без объявленного пространства имен, если есть какой-то способ сделать это, но это всего лишь предположение, и любая оценка приветствуется ,

1 Ответ

0 голосов
/ 30 января 2012

Придумал, как заставить это работать.

Я добавил еще один package-info.java файл в com.company.server.ws.request , который в основном объявил пространство имен no для объекта ArnRequest, например:

@javax.xml.bind.annotation.XmlSchema(elementFormDefault = 
            javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED)
package com.company.server.ws.request;

Если я правильно понимаю, он указывает сериализатору установить пространство имен no для объекта ArnRequest и отключает проверку, устанавливая для формы по умолчанию значение UNQUALIFIED.

Я не совсем уверен, что именно он делает, но теперь он определенно работает, поэтому любая дополнительная информация будет оценена.

...