我需要创建一个实现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驱动程序从数据库中读取。
您认为哪种方式最佳? 哪个最简单的方法?
答案 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
界面处理数据源 - 我认为最简单的方法是第三个建议虽然会有很多缺点(例如性能不佳)
希望这有帮助