2010-11-12 76 views
4

總之,我期望實現的是運行wsdl2java並生成額外代碼的能力。有沒有人做過這件事,可以提供提示/提示/建議,有沒有人做過類似於不同方法的問題?擴展軸代碼生成模塊

在漫長的形式:

背景:

我們的軟件第三方一塊是在許多項目中廣泛使用,但它沒有直接與Web服務整合能力。考慮到這一點,我們採用wsdl,生成客戶端,然後有許多置於頂端的樣板代碼以允許集成。我花了一些時間來補充這一點,但我想要全力以赴。

電流駐波:

我已經寫了一個簡單的第一代碼發生器,其處理的代碼的95%的創建然而,這是一個手寫的XML配置讀取,輸出使用FileWriter的代碼(但是我仍然需要手動編寫代碼,以便將信息傳遞給實際的Web服務客戶端代碼。這只是一個快速和骯髒的解決方案,因爲我需要它很快,並且還充當POC。

的方法來解決這樣: 我在我自己的時間純粹撿這個,因爲我認爲它是一個有趣的問題,但是因爲這樣,我不想浪費它的地段就死路一條途徑。

我相信實現我的目標的方法是寫一個擴展到代碼生成模塊,如此處所述http://wso2.org/library/35,我相信通過編寫這個擴展我將訪問wsdl的軸模型,並可以應用我自己的xslt到它。

如果您同意並採取了類似的行動,是否有任何建議可供您分享,或有用的資源您可以指向我。

如果您不同意我的方法,我會很感激一個簡短的提綱(不想浪費您的時間)爲什麼和建議新的接近。

回答

0

進一步的研究表明,要走的路是創建一個基於AxisServiceBasedMultiLanguageEmitter的新CodeEmitter。

不幸的是,這個項目因爲不再需要創建Web服務客戶端而被封裝。第三方軟件發佈了一個新版本,允許它直接使用Web服務。

0

我從來沒有擴展Axis2 WSDL2Java發射器,所以我不知道你從中獲得多少靈活性。您參考的文章表明您可以很容易地進入生成過程。這真的取決於你必須產生什麼。 最近,我不得不這樣做創建數據庫架構和WSDL樣板代碼,我已經使用了混合的方法:

  • Groovy的

Groovy是偉大的快速原型和模板。例如,您可以從數據庫或Wsdl收集信息並根據模板發出代碼。在這裏你可以看到一些例子:http://groovy.codehaus.org/Groovy+Templates

  • PMD API

PMD是掃描Java代碼並報告潛在問題的工具。它還公開了一個使用XPATH解析代碼的API,並有一個非常豐富的模型可供使用。你可以做的東西,如:

final Java15Parser parser = new Java15Parser(); 
final FileInputStream stream = new FileInputStream("VehicleServiceType.java"); 

final Object c = parser.parse(new InputStreamReader(stream)); 

final XPath xpath = new BaseXPath("//TypeDeclaration/Annotation/NormalAnnotation[Name/@Image = 'WebService']", 
     new DocumentNavigator()); 

for (final Iterator iter = xpath.selectNodes(c).iterator(); iter.hasNext();) { 
    final Object obj = iter.next(); 
     // Do code generation based on annotations... 
} 

就個人而言,我發現,混合方法效果更好,然後單片之一。代碼生成通常是一門藝術而不是一門科學。還有一件事:在我目前的項目中,我正在研究Python(簡單)代碼生成。它有一個非常漂亮的模板庫(jinja),但我不會推薦它解析Java代碼。

希望得到這個幫助!

+0

有趣的建議,謝謝。 – 2010-12-16 09:06:05

0

你已經開始編寫代碼生成器來實現你的目標,所以你可以嘗試繼續這個道路。代碼模型庫是一個非常棒的庫,用於生成代碼。我剛剛用它來生成代碼,它非常好。

我建議你給這個codemodel庫嘗試生成你需要的代碼。這是爲jaxb wsdl編譯爲java編譯器的代碼模型庫。

+0

謝謝,我會看看。 – 2010-12-16 09:05:25

0

我們使用的WSDL2Java很多(但在軸1.4)我唯一的提示是:

1使用複雜的/結構化類型作爲參數例如操作resetWidget(widgetStruct)其中widgetStruct類包含字段widgetId,widgetName,widgetType等而不是resetWidget(arg1,arg2,arg3 ..)。所以明年,當你擴展WSDL並添加更多參數時,所有的遺留代碼仍然可以編譯,而無需擴展所有的方法。這種方法實際上是強加給我們的,因爲如果我們將所有字段作爲參數傳遞,另一個(舊)WSDL工具不會正確生成響應。

2將所有業務邏輯放入其他類中。所以當你重新生成骨架時,你可以放回幾行代碼,而不必更新大量的代碼。

也許在Axis2中解決了一些這些問題。

+0

我很欣賞這個答案,而且我可能會誤解它,但它聽起來像你使用wsdl2java那樣,你實際上並沒有擴展它的代碼生成函數來做比生成骨架更多的功能。 – 2010-12-16 09:04:33