2012-03-03 42 views
2

我對webservices有點新鮮。我正在使用Netbeans 7.0和Axis2。我有Java服務器端代碼和一個Java客戶端。爲了簡化這一點,我將使用一個非常簡單的例子。如何爲從Axis2 Webservice創建的客戶端對象定義toString()方法

我有一個WorkSite類,它有workSiteId,workSiteName和refCode字段,每個字段都有一個getter和setter。而在服務器端,類也有一個重載的toString()方法,它只返回workSiteName。因此,如果我要使用JComboBox創建GUI服務器端並開始向其添加WorkSite對象,則workSiteName將顯示在JComboBox中,用於顯示每個對象。

所以我基本上創建了一個像getWorkSiteList這樣的Web方法,它可以查詢數據庫,創建WorkSite對象並將它們添加到數組中,然後返回數組。除了在Netbeans中查看客戶端Jax-WS「生成源」時,我可以毫無問題地使用WorkSite對象,但getters和setter都在那裏,但toString()方法不在那裏。因此,當我將WorkSite對象從數組中取出並放入JComboBox時,組合框會顯示一些非常醜陋的內容,如每個項目的「examplepackagename.WorkSite.a6d35」,而不是很好,並顯示workSiteName。我想我真正的問題是,我在Netbeans客戶端有一個自動生成的WorkSite.java文件,它沒有我的toString()方法(這叫做骨架對吧?);有沒有辦法讓它包含在服務器端類中定義的toString()方法?如果沒有,編輯自動生成的類是否安全(再次,我認爲這被稱爲骨架,對嗎?),只需添加我的toString()方法?如果我在客戶端編輯自動生成的類,它是否會在重建時被覆蓋?

感謝您的幫助!我希望不要太長時間囉嗦;我只是不知道所有的術語還沒有以簡潔的方式解釋它。

回答

0

正如我在評論中提到,我工作圍繞這通過與SubWorkSite的類,它沒有繼承的例子工地類,但是可以定義一個覆蓋返回super.getWorkSiteName.getValue()的toString()方法。

所以我有一個從webservice調用返回的WorkSite對象列表,我只是遍歷它併爲列表中的每個WorkSite對象創建一個SubWorkSite對象並將其添加到JComboBox。現在,在運行應用程序時,workSiteName將顯示在JComboBox中,而不是您從自動生成的類獲得的醜陋toString()值「examplepackagename.WorkSite.xxxxx」。

我當然願意以更好的方式開展這項工作,如果有人有任何建議;或者任何人有關於Stephen C關於編輯生成器XSLT模板的建議的更多信息。

2

實現此目的的方法是修改Axis2代碼生成器的模板。如果您查看this page上的體系結構圖,您將看到代碼生成器以XML形式生成中間數據結構,然後使用XSLT和一組語言特定模板發出代碼。如果您希望代碼包含額外的toString()方法,那麼顯而易見的方法是修改模板以包含對這些方法的支持。

注意事項:

  1. 你需要了解的體系結構和實現發電機,和它使用的TECNOLOGIES:XSLT尤其如此。

  2. 我不能保證中間XML文件中有足夠的信息來生成您需要的方法。 (我希望會有,但我沒有看過。)

+0

好信息斯蒂芬C,感謝您的答覆。我查看了網絡上的所有內容,試圖找到更多信息,例如模板位於哪裏以及爲Java客戶端編輯哪個文件,並且沒有提供任何有用的信息。我也在我的開發箱的某個地方查找了這些模板,但空着。你有什麼想法? – Jim 2012-03-03 15:58:45

+0

我認爲也許不太理想的做法可能是爲我的自動生成的客戶端類子類化,並在子類中定義toString()方法。然後,當我得到一個WorkSite對象數組時,我可以在其中定義toString()方法的地方創建SubWorkSite對象,將這些對象提供給JComboBox以顯示我想要的名稱,然後如果需要發送SubWorkSite對象回到服務器我可以將其轉換回自動生成的WorkSite類。你認爲這種方法有什麼問題嗎? (除了看起來不喜歡) – Jim 2012-03-03 16:04:00

+0

是的,有一個問題。你如何說服客戶端代碼使用你的子類而不是生成的類來實現實例? – 2012-03-03 16:40:40

相關問題