2012-06-22 17 views
3

我需要創建一個實現Java ResultSet接口的對象從一個通用的SOAP請求中獲取數據(我需要使用這些SOAP結果集和JDBC結果在更高級別上工作套)。從通用的SOAP請求實現ResultSet接口

正如我在標題中寫到的,SOAP請求可以是通用的:它依賴於傳遞的參數並可以使用不同的Web服務,所以我只知道在運行時wsdl和SOAP服務將要傳遞給我的結構。

我一直試圖在最後幾天如何做到這一點要弄清楚,我已經推出了一些想法:

1- SOAP主體轉換爲XML文檔的WebRowSet,即可以解組到WebRowSetImpl類,該類實現WebRowSet接口(擴展ResultSet的接口)。 在這種情況下,我必須從WSDL和SOAP響應文檔開始實時製作海關XSLT。

2-創建Java從SOAP響應對象,然後試圖映射和填充通用存根JDBC結果與Java內的數據集對象

3-從SOAP響應的所有數據存儲到(歸一化或未規範化)數據庫,然後使用任何JDBC驅動程序從數據庫中讀取數據。

你認爲哪種方式最好? 哪個最簡單的方法去?

回答

1

我不認爲它可以或應該完成。

我永遠不想看到任何實施ResultSet逃離持久層。您需要將其映射到集合或對象中並在方法範圍內關閉它。

你真正要求的是將ResultSet映射到的通用集合。您可以獲得的最佳結果是ListsMap,其中鍵爲列名稱,值爲Lists各列或ListMaps,其中每個Map表示列名稱/值對的一行值。

任何一個都是絕對通用的,但是也沒有合同。

我認爲這是一個糟糕的方式來思考網絡服務。好的人通常會記住合同的概念。他們的職能狹隘而明確;它們的輸入和輸出也是如此。

您聽起來像您希望能夠發送用戶希望的任何SQL查詢併發回任何結果。這對我的口味來說太過鬆散。

真實服務擁有其數據並將其用於自己的狹義目的。沒有客戶應該提取一堆東西,做事情,然後放回去。隱藏服務內的所有內容。將這些客戶正在對數據做的事情添加到其API中,並且不要讓抽象泄漏出去。

如果您希望更好地瞭解如何實現面向服務的體系結構,請閱讀Werner Vogel。

+0

我僅暴露更大平臺的一部分,完整的流程爲: 1 - 使用公共從JDBC連接器/皁服務 2-提取數據變換臨時數據接口(因爲這個,我想到了結果集) 3-將轉換的數據持久存儲在數據庫中 – alessiop86

+0

對我來說,仍然聽起來過於寬泛和卑鄙。沒有合約。真正的服務擁有其數據並將其用於自己的狹隘目的。沒有客戶應該提取一堆東西,做事情,然後放回去。隱藏服務內的所有內容,不要讓抽象泄漏出去。你會後悔這樣的設計。 – duffymo

+0

我不會放回我用jdbc連接器或soap獲得的數據,我只是從各種來源提取它們,從我的平臺中定義組合/轉換邏輯,然後將組合/轉換的結果存儲在我的平臺中。這是一種ETL – alessiop86

0

從我的理解,你需要得到的數據:

.1。從關係數據庫經由JDBC

0.2。從通過SOAP請求

Web服務

ResultSet接口是適合工作ONLY關係數據庫絕對不是Web服務JDBC一部分。這就是爲什麼它看起來像你想爲你的任務使用錯誤的工具。

正確的做法是:

.1。自己寫的高級抽象,從兩個關係數據庫Web服務作爲數據源的抽象(不javax.sql.DataSource類混淆),然後提供兩種實現方式:一是與使用JDBC關係數據庫和其他作品,其與網絡服務一起處理SOAP請求。

.2。如果存在,使用一些現有框架來做到這一點。雖然我不確定,但你可以檢查http://www.smooks.org/ - 也許它有一些相關的東西。

如果你真的沒有任何選擇必須只使用JDBC接口數據源的工作 - 我認爲最簡單的辦法是你的第三個建議,但它會產生很多弊端(如壞性能

希望這有助於

+0

我已經在編寫高級抽象了,但是我設計使用了WebRowSet或者類似於高級數據結構的東西,我認爲它可以節省我從JDBC提取器的轉換(只有1個轉換soap-> high level而不是2),而且界面提供了我需要的方法。 – alessiop86

+0

嗯,有趣的解決方案 - 不知道關於'WebRowSet'和按照以下教程http://docs.oracle.com/javase/tutorial/jdbc/basics/webrowset.html它可能是你所需要的,儘管與XSLT它可能非常麻煩。無論如何,祝你好運:) – Yura