簡體   English   中英

如何在不覆蓋現有代碼的情況下更改自上而下的Web服務

[英]How to change a top down web service without overwriting existing code

我是eclipse和Java開發的新手。 如果這聽起來像一個微不足道的問題,請耐心等待。

我正在嘗試修改現有的Web服務。 這最初是使用自頂向下方法開發的(即首先是WSDL然后生成Java bean骨架)。

我已經對WSDL進行了更改,現在需要將它們合並到Web服務中。 當我右鍵單擊WSDL生成Java bean骨架時,現有代碼將被覆蓋。 當我將首選項設置為不覆蓋現有代碼時,它會提示我覆蓋每個文件,我不確定應該覆蓋哪些以及哪些不應該覆蓋。

有沒有辦法可以更改現有代碼而不覆蓋它?

這是我們應該如何修改現有的Web服務?

如果這聽起來像一個微不足道的問題,請耐心等待。

這不是一個微不足道的問題。 您可以在網上找到的所有“Hello World”Web服務示例和教程都是微不足道的,它們從未就如何管理“真實世界”Web服務提供任何建議。

這是我們應該如何修改現有的Web服務?

嗯...不是真的。 我會嘗試為您的特定案例提供一般性解釋,也許是一個可能的解決方案,所以請耐心等待我(:D),因為這將是一個很長的帖子。

合約第一次與合約持續

構建Web服務有兩種方法:合同優先和合同最后。

合同首先意味着創建WSDL,然后生成實現WSDL規定的合同的Java代碼。 合同最后意味着創建Java代碼,然后根據代碼生成WSDL。

兩者都有優點和缺點,但兩者的重要性在於合同。

合約

您的WSDL描述了合同。 部署Web服務后,合同必須保持凍結狀態。 合同是Web服務與其客戶之間通信的基礎(甚至不能讓我開始使用Web服務的互操作性 )。

Web服務和所有客戶端在其代碼中實現此合同。

我已經對WSDL進行了更改......

這並不總是一個好主意。

當Web服務合同發生變化時,合同用戶可能會被破壞。 更改WSDL時,重新生成Web服務代碼以支持新合同。 但客戶呢?

如果新修改違反合同,則必須指示所有客戶獲取新合同並更改其代碼以適應更改。 你有多少客戶為你的這個網絡服務? 您對WSDL做了哪些更改?

合同中斷更改與非中斷更改

您可以在不破壞客戶端的情況下對合同進行一些更改。 例如,您可以添加新操作。 客戶在他們的代碼中不了解它,他們不知道的東西不會傷害他們。 您還可以向現有消息添加一些可選參數; 由於它們是可選的,這意味着它們在通信時可以省略,而客戶端代碼不知道它們以及它們不知道的東西不會傷害它們。 這些都是不間斷的變化

打破變化 ......好吧......打破合同。 這些包括例如更改操作名稱,更改消息參數類型或名稱,添加必需參數等。客戶端代碼現在已損壞。 客戶剛剛發現它(現有代碼不再有效)並且它們受到了傷害。 此時您的Web服務不再可用。

您在WSDL上執行了哪些類型的更改?

代碼

在契約最后方法中,WSDL是基於Web服務代碼生成的。 這樣做的缺點是它將代碼實現與WSDL聯系起來。 如果您對代碼進行了更改,則可能會觸發WSDL中的更改,因此在您與客戶達成一致的合同中。

但是,如果在契約優先方法中您對WSDL進行了更改,然后重新生成Web服務框架代碼,那么您再次更改了合同。 你沒有做得更好......現在你又遇到了另一個問題。 您現在再次生成的Web服務現有框架代碼會發生什么?

從WSDL生成代碼

當您從WSDL生成代碼時,您將獲得Web服務框架。 這是樣板代碼,它只是以合同指定的SOAP格式在線上獲取Web服務消息。

您通常會生成此代碼並將其包含在您的項目中,以供“重要”Web服務代碼(實際提供“服務”的代碼)使用。 如何使用此代碼非常重要。 您必須考慮以后再次生成代碼而不覆蓋現有代碼的情況。

通常,代碼生成工具可以將框架代碼拆分為接口和該接口的實現。 您必須丟棄生成的實現並提供您自己的接口實現 您在不同的位置提供實現,以便在生成框架代碼時不會被覆蓋。 如果界面發生了變化,你的實現中會出現編譯問題,因為它與新合同不匹配,但至少你仍然有修改它的代碼:D。

不幸的是,這不是大多數項目中發生的事情。 人們直接修改生成的實現,當他們再次生成骨架時,他們會松開所有添加的代碼。 大多數生成工具在代碼“這是計算機生成的代碼中插入警告。如果再次生成此代碼,所有更改將丟失......”或類似的東西,但是人們會聽嗎?

您的案例中可能的解決方案

好吧,夠漫無邊際......

有沒有辦法可以更改現有代碼而不覆蓋它?

手動完成(假設它是一個非破壞性的變化)!

這需要一些時間,但這並不難。 您獲取原始WSDL並在單獨的文件夾中生成它的代碼:Folder1。 獲取新的WSDL並在另一個單獨的文件夾中為它生成代碼:Folder2。 對兩個目錄進行區分以查看更改的文件。 查看文件內部。

您現在知道如何在現有項目代碼中更改代碼。 現在,您必須確定最初生成的代碼在生成后是否以某種方式被修改。 將項目文件夾與Folder1進行比較。

然后手動進行修改。

如果這是一個可破壞的更改,您可能想要查看是否可以遷移客戶端。 如果沒有,您可能必須在兩個端點上公開您的Web服務,每個端點都有自己的WSDL合同到同一個Web服務並隨着時間遷移客戶端,如果可能的話。

暫無
暫無

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

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