簡體   English   中英

(Java)如何將經過架構驗證的XML文檔作為參數在分布式組件(例如Web服務或套接字)之間傳遞?

[英](Java) How can I pass Schema-validated XML documents as parameters between distributed components (e.g. web services or sockets)?

這是該場景的描述,對於使用的方法,我也將不勝感激。

我的應用程序的核心是一組由P2P數據庫支持的Web服務。 一個服務接受一個簡單的基於XML的記錄(我為它設計了一個通用模式)。 該服務處理此數據(主要是基於某些條件創建密鑰),並將原始數據與創建的密鑰一起傳遞到偵聽P2P節點之一中的偵聽SocketServer。 該密鑰數據對被路由到適當的節點,該節點將數據(與作為ID的密鑰相關聯)存儲在XML數據庫中。

第二項服務接受基於相同架構構造的查詢文檔,但具有用於在先前存儲的文檔中進行搜索和匹配的可選值。 因此,第二個服務會將此查詢(帶有正確的關鍵字)傳遞給P2P部分,獲取結果並將其傳遞回服務客戶端。

例如,如果提交給第一個服務的原始記錄是<attr1> value1 </ attr1> <attr2> value2 </ attr2>(屬性列表以及該模式要求的其他元數據),則第二個服務應該檢索該記錄,如果收到的查詢為<attr2> value2 </ attr2>

(我稍后可以考慮使用更復雜的XPath或XQuery查詢,因為底層XML數據庫允許在這里而不是在此處進行值的精確匹配,但這在當前階段並不重要。我還在研究第三項服務,但這取決於獲得前兩個形狀正確)

所以我的問題是:

1)我應該使用哪種數據類型作為Web服務的參數? 如何將我的模式用於此用途? 為此,我正在考慮各種XML綁定框架(尤其是JAXB和SDO),但不知道如何進行。

2)如何增強這兩個服務(稱為存儲和搜索),以使用基於原始通用模式動態創建的模板? 該服務仍將接受主要模式類型的文檔,但是具有基於模板的內部屬性列表,例如template1僅要求其值是int,而template2需要(浮點)和(字符串)。 當前基於JSP的原型是手動創建此模板的,但它是一個手工組裝的XML文檔(分散在文本中的<>標簽),並且沒有類型檢查,所以我認為我可以做得更好!

3)是否可以生成一個快速的Web應用程序原型,以簡化對該系統的訪問(再次通過使用架構(&模板)來編輯適當的XML消息結構),我正在尋找的是(人類)用戶選擇一個模板,然后只需“填寫空白”並提交,無需任何花哨的外觀。

4)我可以或也可以使用此XML消息類型在套接字之間進行通信嗎?

5)是否將服務部署為無狀態EJB是否重要? 我是否需要它們成為EJB或servlet綽綽有余?

我目前有一個基本的實現(來自以前的開發人員),是為了滿足我當前需求的一部分(我正在改進服務並添加新的派生需求),但是沒有模式或驗證,並且數據一直作為基本傳遞字符串,從而提供弱類型的輸入並且難以更新手動解析。 我想將其更新為更強的綁定類型的原因是為了在數據模式中引入更改,這些更改將很容易在整個系統中傳遞。 基本上,我希望系統盡可能減少與所使用的數據格式/架構的耦合; 當前的原型與數據太相關了,我發現在不破壞系統的情況下更改數據極其困難。

我的最初調查使我考慮使用JAXB,但它僅支持靜態類型(無法在運行時動態創建要持久保存以供以后使用的模式)。 所以我遇到了具有動態和靜態類型的SDO。 問題在於,沒有足夠的社區和/或使用此方法的示例,因此似乎很有風險(Apache Tuscany和Eclipselink實現的示例非常稀缺,而且我找不到不超過5年的完整示例(例如http://www.ibm.com/developerworks/java/library/j-sdo/ ),還解決了SDO的XML用例(大多數似乎都集中在SDO的關系用法上)。

這是我第一次(在這里和其他地方)尋求編程幫助,請耐心等待。 我在網上搜索了很多內容,但是找不到有用的東西,但到處都是沒有加成的部分。

任何評論或提示都非常感謝。

f

編輯

我忘記了一件事:搜索服務將如何取回結果? 由於它正在打開客戶端套接字連接,因此無法同步獲取任何結果。 當前的實現通過使服務客戶端在隨機端口上打開偵聽套接字並將此聯系信息放入查詢文檔中來解決此問題。 搜索Web服務將查詢發送到p2p部分后,它完成。 p2p將結果作為WS調用發送到另一個服務,該服務將它們發送回服務客戶端套接字。 我不太喜歡這種方法,有沒有更優雅的解決方案?

我負責EclipseLink JAXB和SDO的實現,並在這些規范上代表Oracle,因此希望可以為您提供幫助。 這個問題與 9月份在JavaOne上的演講非常相似。

1)我應該使用哪種數據類型作為Web服務的參數? 如何將我的模式用於此用途? 為此,我正在考慮各種XML綁定框架(尤其是JAXB和SDO),但不知道如何進行。

這取決於您使用的Web服務框架。 JAXB與JAX-WS一起使用更容易,盡管JAXB與JAX-RS SDO一起使用仍然更容易,但是它是一種可能的選擇。

2)如何增強這兩個服務(稱為存儲和搜索),以使用基於原始通用模式動態創建的模板? 該服務仍將接受主要模式類型的文檔,但是具有基於模板的內部屬性列表,例如template1僅要求其值是int,而template2需要(浮點)和(字符串)。 當前基於JSP的原型是手動創建此模板的,但它是一個手工組裝的XML文檔(分散在文本中的<>標簽),並且沒有類型檢查,所以我認為我可以做得更好!

我不是100%這里的意思,但是以下內容可能會有所幫助:

3)是否可以生成一個快速的Web應用程序原型,以簡化對該系統的訪問(再次通過使用架構(&模板)來編輯適當的XML消息結構),我正在尋找的是(人類)用戶選擇一個模板,然后只需“填寫空白”並提交,無需任何花哨的外觀。

JAX-RS是用於創建快速原型的很好的框架。 以下是我創建的示例:

4)我可以或也可以使用此XML消息類型在套接字之間進行通信嗎?

我更喜歡通過HTTP協議進行通信的框架(如JAX-RS)。

5)是否將服務部署為無狀態EJB是否重要? 我是否需要它們成為EJB或servlet綽綽有余?

我的偏好是為該服務使用EJB會話bean。 如果要與數據庫進行交互,則可以利用Java Transaction API(JTA)來管理數據庫事務。

SDO

EclipseLink是SDO 2.1.1(JSR-235)參考實現。 我們在下面發布了一些示例。 如果您正在尋找如何做一些特定的事情,我將嘗試發布一個相關的例子。

傑克斯

JAXB是靜態的。 它也比SDO更受歡迎。 在EclipseLink中認識到這一點,我們實現了動態JAXB功能。 它通過JAXB傾斜為您提供SDO的動態方面。

編輯#1

由於您正在處理JAX-WS,並且您的模型幾乎完全是動態的,因此我認為您應該完全跳過JAXB綁定。 在下面的鏈接中,請參閱“關閉數據綁定”部分

這將使我們將消息的主體作為javax.xml.transform.Source對象。 我們將需要基於動態模板處理XML。 SDO將是一個不錯的選擇。 您可以不斷使用XML模式將新類型添加到HelperContext。

helperContext.getXSDHelper().define(schema1, null);
helperContext.getXSDHelper().define(schema2, null);

您將可以從Web服務取消封送Source,如下所示:

XMLDocument doc = helperContext.getXMLHelper().load(source, null, null);
DataObject rootDataObject = doc.getRootObject();
String someValue = rootDataObject.getString("attr3/childAttr/anotherChildAttr");

調用另一個服務時,您還可以使用XMLHelper將對象編組為XML。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM