【发布时间】:2010-04-19 13:17:10
【问题描述】:
我必须使用 Java 应用程序中的 .NET 托管 Web 服务。两者之间的互操作性通常非常好。我遇到的问题是 .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
我的问题是,尽管这不是推荐的做法,但我不得不使用返回带有 Java 的 DataSet 的 Web 服务。当你用 .NET 以外的任何东西为类似的东西生成代理时,你基本上会得到一个看起来像这样的对象:
@XmlElement(namespace = "http://www.w3.org/2001/XMLSchema", required = true)
protected Schema schema;
@XmlAnyElement(lax = true)
protected Object any;
第一个字段是应该描述数据集的实际架构。当我在 Java 中使用 JAX-WS 和 JAXB 进行处理时,它会将所有 XS-Schema 作为 Java 对象引入此处以表示。遍历 JAXB 的对象树是可能的,但并不漂亮。 any 字段表示由架构指定的架构中的 DataSet 的原始 XML。
数据集的结构非常一致,但数据类型确实发生了变化。我需要访问类型信息,并且架构确实因调用而异。我有一些选择,但似乎没有一个是“好”的选择。
- 尝试在运行时使用 JAXB 从模式生成 Java 对象似乎是个坏主意。这太慢了,因为它需要每次都发生。
- 使用 JAX-WS 引入的 JAXB 对象蛮力遍历模式树。
- 也许不使用 JAXB 来解析架构,而是将其作为 XML 处理并使用 XPath 来尝试查找我需要的类型信息会更容易。
还有其他我没有考虑过的选项吗?是否有一个 Java 库可以轻松解析 DataSet 对象?其他可能有类似情况的人做了什么?
【问题讨论】:
标签: java .net web-services interop dataset