从通用SOAP请求实现ResultSet接口

时间:2012-06-22 09:22:36

标签: java xml web-services soap wsdl

我需要创建一个实现Java ResultSet接口的对象来获取来自通用SOAP请求的数据(我需要使用这些SOAP结果集和JDBC结果集在更高级别上工作)。

正如我在标题中所写,SOAP请求可以是通用的:它取决于传递的参数并且可以使用不同的Web服务,因此我只知道运行时wsdl和SOAP服务将为我提供的结构。

我一直试图在过去几天弄清楚如何做到这一点,我提出了一些想法:

1-将SOAP主体转换为xml WebRowSet文档,该文档可以解组为WebRowSetImpl类,该类实现WebRowSet接口(扩展ResultSet的接口)。 在这种情况下,我必须从WSDL和SOAP响应文档开始,即时创建海关XSLT。

2-从SOAP响应创建Java对象,然后尝试使用java对象中的数据映射和填充通用存根JDBC结果集

3-将SOAP响应中的所有数据存储到(规范化或非规范化)数据库中,然后使用任何JDBC驱动程序从数据库中读取。

您认为哪种方式最佳? 哪个最简单的方法?

2 个答案:

答案 0 :(得分:1)

我认为不能或不应该这样做。

我绝不希望看到任何实现ResultSet从持久层逃脱的事情。您需要将其映射到集合或对象中,并在方法范围内将其关闭。

您真正要求的是将ResultSet映射到的通用集合。最好的是Map Lists,其中键是列名,值为Lists列,或List Maps,其中每个Map代表一行的列名/值对。

其中一个绝对是通用的,但也没有合同。

我认为这是一种考虑Web服务的糟糕方式。好的人通常会记住合同的概念。它们的功能狭窄且定义明确;他们的投入和产出也是如此。

您听起来好像希望能够发送用户希望的任何SQL查询并发回任何结果。根据我的口味,这太过宽松了。

真实服务拥有其数据并将其用于其狭窄的目的。没有客户应该提取一堆东西,做事情,并把它放回去。隐藏服务中的所有内容。将这些客户端正在对数据执行的操作添加到其API中,并且不要泄露抽象。

如果您想更好地了解如何实现面向服务的架构,请阅读Werner Vogel。

答案 1 :(得分:0)

根据我的理解,您需要获取数据:

0.1。来自关系数据库通过JDBC

0.2。来自网络服务通过SOAP请求

ResultSet界面是JDBC的一部分,适用于 ONLY 关系数据库绝对不使用 Web服务。这就是为什么您希望使用错误的工具来完成任务。

正确的方法是:

0.1。编写自己的高级抽象,从关系数据库 Web服务中抽象出来作为数据源(不要与javax.sql.DataSource类混淆)然后提供两个实现:一个使用JDBC使用关系数据库,另一个使用 Web服务处理SOAP请求。

0.2。如果存在,请使用一些现有框架执行此操作。虽然我不确定,但您可以查看http://www.smooks.org/ - 也许它有相关内容。

如果您确实没有任何选择必须仅使用JDBC界面处理数据源 - 我认为最简单的方法是第三个建议虽然会有很多缺点(例如性能不佳

希望这有帮助