Axis2 с привязкой данных XMLBeans - проблема с клиентом Java, сгенерированным из схемы XSD с anyType - PullRequest
2 голосов
/ 28 октября 2010

Я сгенерировал клиент, используя платформу Axis2 с XMLBeans в качестве метода привязки данных.Схема XSD имеет следующий вид:
<xsd:schema><br> <xsd:element name="profile" type="anyType"/><br> </xsd:schema>

Сгенерированный Java-объект, который принимает участие в запросе SOAP, содержит методы получения и установки, позволяющие получить и установить профиль.Вот подпись метода: requestDocument.setProfile(XmlObject profile);

Проблема в том, что даже если мне нужно пропустить несколько узлов в качестве профиля, а не действительный документ XML, но XMLObject ожидает документ XML с корневым узлом.

Мне нужно передать:
<accounts></accounts><br> <payees></payees>

На самом деле служба, которую я использую, ожидает эти узлы, но не ограничивает их в схеме.Таким образом, я не могу добавить еще один корневой узел, потому что даже если служба не выдаст никаких исключений, профиль не будет использоваться.

XMLBeans уже добавляет базовое дерево XML, я имею в виду узел профиля вдокумент запроса.Таким образом, я не могу использовать его в качестве корневого узла.если я добавлю корневой узел, будет создан следующий XML
<profile> <profile></profile> </profile>

И я хочу, чтобы документ был отформатирован следующим образом:
<profile><br> <accounts></accounts> <payees></payees><br> </profile>

Я предпочитаю неизменение схемы сервиса.Я хотел бы знать, есть ли способ с Axis2 / XMLBeans решить эту проблему.

1 Ответ

1 голос
/ 28 октября 2010

Я нашел решение, которое, вероятно, является обходным, а не чистым способом, которым это должно быть сделано.Вместо того, чтобы устанавливать профиль с XMLObject следующим образом:
requestDocument.setProfile(XmlObject profile);
Я использовал объект org.w3c.dom.Node для создания содержимого профиля.См. Ниже:
1. Создайте элементы org.w3c.dom.Element для добавления в профиль:
Element accountsElt = profileDocument.createElement("accounts");
Element payeesElt = profileDocument.createElement("payees");
2. Создайте пустой документ в документе для отправки наслужба, обратите внимание, что объект генерируется автоматически:
requestDocument.addNewProfile();
3. Получите пустой профиль и добавьте дочерние элементы к его корневому узлу: requestDocument.getProfile().getDomNode().appendChild(accountsElt); requestDocument.getProfile().getDomNode().appendChild(payeesElt);

Надеюсь, это поможет.

...