Я должен использовать размещенный веб-сервис.NET из JAVA-приложения. Совместимость между этими двумя обычно очень хороша. Проблема, с которой я сталкиваюсь, состоит в том, что разработчик приложений.NET принял решение выставить данные с помощью объекта DataSet.NET. Существует много статей, записанных относительно того, почему Вы не должны делать этого и как это делает совместимость трудной:
Моя проблема состоит в том, что несмотря на это не являющееся методическими рекомендациями, я застреваю с необходимостью использовать веб-сервис, возвращая 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 возможен, но не симпатичен. Любое поле представляет необработанный XML для DataSet, который находится в схеме, указанной схемой.
Структура набора данных довольно последовательна, но типы данных действительно изменяются. Мне нужен доступ к информации о типе, и схема действительно варьируется от "вызова к вызову". Я имею, хотя из нескольких опций, но ни один не походит на 'хорошие' опции.
Есть ли другие возможности, которые я не рассмотрел? Существует ли библиотека Java для парсинга объектов DataSet легко? Что сделали другие люди, у кого могут быть аналогичные ситуации?
К сожалению, я не думаю, что здесь есть простой ответ. Что бы я сделал, так это создать веб-службу Proxy в .NET, которую вы могли бы вызвать из Java, которая получит набор данных, преобразует его во что-то более потребляемое и затем вернет его в ваш Java-код.
Ваше приложение Java работает на сервере? Если это так, установите Mono на сервер и используйте ADO.NET, встроенный в Mono, для преобразования набора данных в то, что может понять Java. Преимущество состоит в том, что вся интерпретация набора данных выполняется за вас в Mono. Вы даже можете использовать IKVM, чтобы оставаться в языковом мире Java. В любом случае, в мире Mono у вас может быть локальная служба, которая может выполнять преобразование, или просто утилита, которая преобразует набор данных в файловую систему в формате, понятном Java.
Рассматривали ли вы использование XSLT для необработанного возвращенного XML, чтобы преобразовать его во что-то, с чем вы сможете справиться более легко?
Я использовал этот подход для преобразования сложное возвращаемое значение во что-то похожее на
<ops>
<set name="foo" value="bar"/>
<set name="foo2" value="bar2" />
....
</ops>
. Это переводит логику на язык, хорошо подходящий для обработки XML, вместо того, чтобы вручную кодировать его на Java.