Мне нужно использовать веб-службу, размещенную .NET, из приложения Java. Взаимодействие между ними обычно очень хорошо. Проблема, с которой я сталкиваюсь, заключается в том, что разработчик .NET-приложений решил предоставить данные с помощью объекта .NET DataSet. Есть много статей, написанных о том, почему вы не должны этого делать и как это затрудняет взаимодействие:
- http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx
- http://www.lhotka.net/weblog/ThoughtsOnPassingDataSetObjectsViaWebServices.aspx
- http://aspnet.4guysfromrolla.com/articles/051805-1.aspx
- http://www.theserverside.net/tt/articles/showarticle.tss?id=Top5WSMistakes
Моя проблема заключается в том, что, несмотря на то, что это не рекомендуется, я застрял в том, что вам нужно использовать веб-службу, возвращающую 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? Что сделали другие люди, у которых могут быть подобные ситуации?