Как генерировать бизнес-объекты на стороне Java/JAXB/CXF при использовании веб-службы MS/.NET/.asmx?

У нас есть несколько веб-сервисов на базе MS, которые в интрасети видны как ссылки.asmx?WSDL. Нет проблем, когда эти веб-сервисы используются с последней версией Visual Studio. Все бизнес-объекты имеют смысл. Я подозреваю, что Microsoft использует некое секретное рукопожатие, когда используется ServiceReference, и полагается на некоторые собственные знания о том, какой фактический тип CSharp находится за элементом, типизированным как <s:schema>

Но нашему отделу нужно все использовать Java. Мой выбор - CXF (v.2.4.2), и он хорошо работает с Eclipse, SOAP-UI, Tomcat. И есть проблемы с совместимостью. Во-первых, каждый wsdl должен быть изменен вручную. Все <s:schema> <s:any> are replaced with single <s:any>, После этого CXF может завершить генерацию Java на стороне клиента. Но объекты Java не являются бизнес-объектами POJO. Это какие-то элементы DOM, например

/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;any/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "any"
})
public static class GetDepartmentsResult {

    @XmlAnyElement(lax = true)
    protected Object any;

    /**
     * Gets the value of the any property.
     * 
     * @return
     *     possible object is
     *     {@link Object }
     *     
     */
    public Object getAny() {
        return any;
    }

    /**
     * Sets the value of the any property.
     * 
     * @param value
     *     allowed object is
     *     {@link Object }
     *     
     */
    public void setAny(Object value) {
        this.any = value;
    }

}

Когда код тестируется во время выполнения, все работает нормально. Но каждый объект должен рассматриваться как элемент DOM. Я уверен, что где-то допустил ошибку, удалив <s:schema> или при использовании wsld2java, поэтому он потерял семантику. Но что мне делать именно в CXF, чтобы классы Java выглядели так же чисто, как классы CSharp?

Спасибо.

Изменить: получил некоторые подсказки на http://msdn.microsoft.com/en-us/magazine/cc188755.aspx, я надеюсь, что эта ссылка будет действительна позже, когда кто-то ищет тот же ответ. Другой способ найти статью:

Журнал MSDN> Выпуски> 2003 > Апрель> Файлы XML: веб-службы и наборы данных

1 ответ

Решение

Ответ: невозможно.

После исчерпывающего исследования становится очевидным, что бизнес-POJO невозможно восстановить на клиенте, когда на стороне службы нет объектов Business CSharp. Так просто.

В моей конкретной ситуации:

  • CXF 2.4.2, использующий wsdl2java ASMX ASP.NET, выдаст ошибку s:schema: FAIL
  • SOAPUI с CXF 2.4.2 потерпит неудачу по той же причине
  • Oracle Sun Metro Glassfish 3.1, требующий импорта ASMX ASP.NET, будет нуждаться в локальных копиях схем: PASS (но требует локальной копии WSDL и по-прежнему никаких бизнес-объектов)

В будущем лучший сценарий:

  • Oracle Sun WSIT Tango использует службу Microsoft WCF с дополнительным "секретным рукопожатием" для предоставления некоторой метаинформации как во время потребления, так и во время выполнения.
Другие вопросы по тегам