Как генерировать бизнес-объекты на стороне 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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <any/>
* </sequence>
* </restriction>
* </complexContent>
* </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 с дополнительным "секретным рукопожатием" для предоставления некоторой метаинформации как во время потребления, так и во время выполнения.