Мне нужно использовать размещенную в .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-схему в виде объектов Java, которые будут здесь представлены. Прогулка по дереву объектов JAXB возможна, но не очень хороша. Поле any представляет собой необработанный XML для DataSet, который находится в схеме, указанной схемой.
Структура набора данных довольно последовательна, но типы данных меняются. Мне нужен доступ к информации о типе, а схема меняется от звонка к звонку. У меня есть несколько вариантов, но ни один из них не кажется «хорошим».
- Попытка сгенерировать объекты Java из схемы с использованием JAXB во время выполнения кажется плохой идеей. Это будет слишком медленно, так как это должно происходить каждый раз.
- Грубая сила обходит дерево схемы с использованием объектов JAXB, внесенных JAX-WS.
- Возможно, вместо использования JAXB для синтаксического анализа схемы было бы проще работать с ним как с XML и использовать XPath, чтобы попытаться найти нужную мне информацию о типе.
Есть ли другие варианты, которые я не рассматривал? Есть ли библиотека Java для простого анализа объектов DataSet? Что сделали другие люди, у которых могут быть похожие ситуации?