Подтвердить что ты не робот

Анализ .NET DataSet, возвращаемого с веб-службы .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-Schema в качестве объектов Java, которые будут представлены здесь. Прогулка по дереву объектов JAXB возможна, но не очень. Любое поле представляет собой необработанный XML для DataSet, который находится в схеме, указанной схемой.

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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