Анализ набора данных .NET, возвращаемого веб-службой .NET в Java

Мне нужно использовать размещенную в .NET веб-службу из приложения Java. Совместимость между ними обычно очень хорошая. Проблема, с которой я столкнулся, заключается в том, что разработчик приложения .NET решил предоставить данные с помощью объекта .NET DataSet. Написано множество статей о том, почему вам не следует этого делать и как это затрудняет совместимость:

Моя проблема в том, что, несмотря на то, что это не рекомендуемая практика, мне приходится использовать веб-службу, возвращающую DataSet с Java. Когда вы генерируете прокси для чего-то подобного с чем-либо, кроме .NET, вы в основном получаете объект, который выглядит следующим образом:

    @XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
    protected Schema schema;
    @XmlAnyElement(lax = true)
    protected Object any;

Это первое поле - это фактическая схема, которая должна описывать DataSet. Когда я обрабатываю это с помощью JAX-WS и JAXB в Java, он переносит всю XS-схему в виде объектов Java, которые будут здесь представлены. Прогулка по дереву объектов JAXB возможна, но не очень хороша. Поле any представляет собой необработанный XML для DataSet, который находится в схеме, указанной схемой.

Структура набора данных довольно последовательна, но типы данных меняются. Мне нужен доступ к информации о типе, а схема меняется от звонка к звонку. У меня есть несколько вариантов, но ни один из них не кажется «хорошим».

  • Попытка сгенерировать объекты Java из схемы с использованием JAXB во время выполнения кажется плохой идеей. Это будет слишком медленно, так как это должно происходить каждый раз.
  • Грубая сила обходит дерево схемы с использованием объектов JAXB, внесенных JAX-WS.
  • Возможно, вместо использования JAXB для синтаксического анализа схемы было бы проще работать с ним как с XML и использовать XPath, чтобы попытаться найти нужную мне информацию о типе.

Есть ли другие варианты, которые я не рассматривал? Есть ли библиотека Java для простого анализа объектов DataSet? Что сделали другие люди, у которых могут быть похожие ситуации?


person Chris Dail    schedule 19.04.2010    source источник


Ответы (3)


К сожалению, я не думаю, что здесь есть простой ответ. Что бы я сделал, так это создать веб-службу Proxy в .NET, которую вы могли бы вызвать из Java, которая получит набор данных, преобразует его во что-то более потребляемое и затем вернет его в ваш Java-код.

person Doobi    schedule 24.04.2010

Ваше приложение Java работает на сервере? Если это так, установите Mono на сервер и используйте ADO.NET, встроенный в Mono, для преобразования набора данных в то, что может понять Java. Преимущество состоит в том, что вся интерпретация набора данных выполняется за вас в Mono. Вы даже можете использовать IKVM, чтобы оставаться в языковом мире Java. В любом случае, в мире Mono у вас может быть локальная служба, которая может выполнять преобразование, или просто служебная программа, которая преобразует набор данных в файловую систему в формате, понятном Java.

person zumalifeguard    schedule 25.04.2010
comment
Приятное нестандартное мышление. - person David Robbins; 29.04.2010
comment
Всегда приятно быть услышанным, когда думаешь нестандартно :) - person zumalifeguard; 07.05.2010

Рассматривали ли вы возможность использования XSLT с необработанным XML, возвращенным, чтобы преобразовать его во что-то, с чем вам будет легче справиться?

Я использовал этот подход, чтобы преобразовать сложное возвращаемое значение во что-то похожее на

<ops>
  <set name="foo" value="bar"/>
  <set name="foo2" value="bar2" />
  ....
 </ops>

Это переводит логику на язык, хорошо подходящий для обработки XML, вместо того, чтобы вручную кодировать его на Java.

person Thorbjørn Ravn Andersen    schedule 29.04.2010