Каким будет класс для результата метода веб-службы? - PullRequest
2 голосов
/ 16 сентября 2009

Партнер предоставил мне WSDL для своих веб-служб. Я не слишком разбираюсь в веб-сервисах, поэтому немного скептически отношусь к WSDL. Один конкретный метод позволяет нам получить некоторую информацию, но мы можем использовать ее только один раз (или столкнуться со штрафом.) Проблема в том, что она возвращается в виде «сырого XML» внутри ответа SOAP, поэтому я не совсем уверен, что будет быть возвращенным, и, таким образом, как бороться с ним и правильно хранить его.

Соответствующая часть WSDL такова:

<s:element name="MethodResponse"> 
    <s:complexType> 
      <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" name="MethodResult"> 
          <s:complexType mixed="true"> 
            <s:sequence> 
              <s:any /> 
            </s:sequence> 
          </s:complexType> 
        </s:element> 
      </s:sequence> 
    </s:complexType> 
  </s:element> 

wsimport сгенерировал следующий класс:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "methodResult"
})
@XmlRootElement(name = "MethodResponse")
public class MethodResponse {

    @XmlElement(name = "MethodResult")
    protected MethodResponse.MethodResult methodResult;

    public MethodResponse.MethodResult getMethodResult() {
        return methodResult;
    }

    public void setMethodResult(MethodResponse.MethodResult value) {
        this.methodResult = value;
    }


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

        @XmlMixed
        @XmlAnyElement(lax = true)
        protected List<Object> content;

        public List<Object> getContent() {
            if (content == null) {
                content = new ArrayList<Object>();
            }
            return this.content;
        }

    }

}

Итак, вопрос в том, каким будет класс объектов, возвращаемых getContent ()? У предоставленного ими образца C # нет MethodResponse или MethodResult, но тип возвращаемого значения - просто XmlNode.

Кстати, хотя код был сгенерирован wsimport, приложение использует Axis2. Другие доступные методы возвращают правильные объекты.

Простой тест (пример сервера, работающий на Mono) сгенерировал исключение на стороне клиента:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Could not deserialize Soap message

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2009

Смешанные элементы содержимого довольно сложны для обработки в JAXB.

Ваш List<Object> может быть смесью:

  • String, для представления текстового содержимого в элементе
  • JAXBElement, для представления типов элементов, известных схеме, которые не имеют аннотации @XmlRootElement
  • Экземпляры классов, известных контексту, которые do имеют @XmlRootAnnotation
  • org.w3c.dom.Element если содержимое не известно контексту

Javadoc для @XmlMixed более подробно описан, но на этом все основано.

0 голосов
/ 17 сентября 2009

Я бы сказал, что такой универсальный WSDL совершенно бесполезен. Нет контракта, нет безопасности типов, нет преимуществ для WSDL. Что вы изучаете, изучая это? Ничего такого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...