xFire開發webService返回複雜物件
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
XFire開發時,在返回資料型別時遇到了一些麻煩,查到這樣一篇文單,非常不錯,故收藏之。
翻譯:zilong3927 原文地址:http://docs.codehaus.org/display/XFIRE/Mapping+collections
呼叫Web Services時,經常需要返回集合(collection)作為結果,或者接受collection型的引數。 SOAP本身就支援這一點。
但是這一機制的問題在於,java語言的collections是無型別的(untyped).因此,如果要在Java 1.4 當中支援collections,就需要做一些額外的工作。
首先而且是推薦的做法是在JDK5當中使用範型(generics)。範型能夠使你在程式碼當中為你的collections 指定型別資訊,從而允許xfire自動地推匯出collection型別,生成正確的
下面示例瞭如何寫這樣的一個方法:
public Collection < String > getValuesForIds(Collection < Integer > );
有些情況下並不總能夠使用範型(generics).例如,如果你的部署環境使用
對於這樣的一些情況而言,你需要生成一個xml對映檔案,來指定方法和它們對應的集合型別(collection types).
這個xml檔案的名字必須是<className>.aegis.xml,其中className是你的服務(service)的介面類(unqualified class)的名字。
下面最好通過一個例子來展示這個xml檔案的格式。我們想要展現的服務有這樣的一個介面:
public interface MyService1{
String getFoo();
Collection getCollection();
void setList( int id , java.util.List);
}
既然程式碼中的collections沒有指定型別,我們劇需要生成一個xml檔案來指定所需要的型別。這個檔案的路徑應該和MyService1.class在同一個包(package)當中,並且它的名字應該是 MyService1.aegis.xml
對於這個介面來說,一個最簡單的對映檔案如下:
< mappings >< mapping >
< method name = "getCollection" >
< return-type componentType = "java.lang.String" />
</ method >
< method name = "setList" >
< parameter index = "1" componentType = "java.lang.String" />
</ method >
</ mapping >
</ mappings >
注意這個對映檔案確切地指定了所需要的資訊,不包含任何冗餘。例如,getFoo方法沒有被指定,這是由於它沒有包含任何collections,因此能夠在沒有任何對映資訊的情況下暴露給使用者。
其次,setCollection 方法沒有指定索引為0的引數。這是由於該引數型別為int,因此不需要任何對映
如果我們有多個方法,都匹配指定的對映又該怎麼辦? 這種情況下,對映就對所有匹配的方法均有效。
所以,如果在我們的介面中增加以下的方法:
void setList( int id ,java.util.List, boolean persist);
那麼現在我們的對映定義對於兩個setList 方法都有作用。這種情況下,我們不必為額外的引數(譯者注:此處指boolean persist)指定兩次對映. 對映檔案就指定了所有那些第二個引數為List的方法,並假定List中包含的都是strings。
如果我們想讓那個具有3個引數的方法,其中的list不包含Strings,而是實際上包含Dates? 這種情況下,就需要一個更確切的對映來覆蓋(override)原先那個更一般的,所以我們的對映檔案需要新增下面這個定義:
< method name = "setList" >< parameter index = "1" componentType = "java.lang.String" />
< parameter index = "2" class = "boolean" />
</ method >
注意一下型別屬性。現在這個對映將對所有那些第二個引數為List,第三個引數為boolean型的方法適用。在我們的介面當中,這個對映唯一地確定了一個特定的方法,使用這個對映就能夠解釋方法當中的List引數。
在優先順序方面,更確切的對映總是優先於更一般的。
讓我們考慮下面這個複雜一些的例子:
public interface MyService2
{
Collection getCollection(); // method 1
Collection getCollection( int id); // method 2
Collection getCollection( String id); // method 3
Collection getCollectionForValues( int value , Collection c); // method 4
Collection getCollectionForValues( String id , Collection c); // method 5
}
對映檔案的內容為:
< mappings >< mapping >
<!-- mapping 1 -->
< method name = "getCollection" >
< return-type componentType = "java.lang.Double" />
</ method >
<!-- mapping 2 -->
< method name = "getCollection" >
< return-type componentType = "java.lang.Float" />
< parameter index = "0" class = "int" />
</ method >
<!-- mapping 3 -->
< method name = "getCollectionForValues" >
< return-type componentType = "java.math.BigDecimal" />
</ method >
<!-- mapping 4 -->
< method name = "getCollectionForValues" >
< parameter index = "0" class = "java.lang.String" />
< parameter index = "1" componentType = "java.util.Date" />
</ method >
<!-- mapping 5 -->
< method name = "getCollectionForValues" >
< return-type componentType = "java.util.Calendar" />
< parameter index = "0" class = "int" />
< parameter index = "1" componentType = "java.lang.Bit" />
</ method >
</ mapping >
</ mappings >
這個檔案的格式是不需要做過多解釋的。但有幾點還是需要加以說明。
先來看一下第一個對映(mapping 1)。這個對映指定了所有getCollection 方法所返回的collections contain均包含java.lang.Doubles。如果沒有指定其他的getCollection對映,那麼這個對映將對方法1, 2, 3都適用。
但是,第二個對映更加明確地指定了它所適用的方法。即如果getCollection方法的第一個引數是int型,那麼該方法所返回的collection包含的是Float 型。由於這條規則更加明確,它將為方法2覆蓋掉第一個對映,這是滿足對映約束標準的。
使用以上的規則,不難推匯出方法4和方法5返回的collections結果的元件型別(component types)。
對於使用collections的java beans來說,語法也是類似的。例如,比方說我們有一個Company bean,包含了一個List ,其中的物件是employees:
public class Company
{
private Collection employees;
Collection getEmployees() { return employees; }
public void setEmployees(Collection employees) { this .employees = employees };
}
除了可以使用<method> & <parameter> 元素外,也可以使用<property>元素:
< mappings >< mapping >
< property componentType = "org.codehaus.xfire.Employee" />
</ mapping >
</ mappings >
Java Maps 並不能很好地對映到 XML Schema (no pun intended) ,因為XML Schema 中沒有Map的概念,客戶端也是這樣,Maps被轉換成{key, value}元組的集合。除了要提供value的型別以外,你還必須為Aegis 提供key的型別:
public class GiftService {
Map getGiftList() { /* returns a map of NiceChild => Present */ }
}
對映檔案應該像下面這樣:
< mappings >< mapping >
< method name = "getGiftList" >
< return-type keyType = "org.codehaus.xfire.NiceChild" componentType = "org.codehaus.xfire.Present" >
</ method >
</ mapping >
</ mappings >
這將生成下面的型別:
< xsd:complexType name = "NiceChild2PresentMap" >< xsd:sequence >
< xsd:element name = "entry" minOccurs = "0" maxOccurs = "unbounded" >
< xsd:complexType >
< xsd:sequence >
< xsd:element name = "key" type = "ns1:NiceChild" minOccurs = "0" maxOccurs = "1" />
< xsd:element name = "value" type = "ns1:Present" minOccurs = "0" maxOccurs = "1" />
</ xsd:sequence >
</ xsd:complexType >
</ xsd:element >
</ xsd:sequence >
</ xsd:complexType >
Collections of Collections of Collections of....
在某些情況下,你可能想要傳遞Collections of Collections。比方說你有一個返回List of a List of Doubles的服務 (不要問為什麼你要做這樣一件事情...):
public class ListService
{
public List getListOfListOfDoubles
{
List l = new ArrayList();
List doubles = new ArrayList();
doubles.add( new Double ( 1.0 ));
l.add(doubles);
return l;
}
}
要處理這種情況,我們需要引進一個新的<component>元素。下面是一個很好的例子:
< mappings >< mapping >
< method name = "getListofListofDoubles" >
< return-type componentType = "#someDoubles" />
</ method >
< component name = "someDoubles" class = "java.util.List" componentType = "java.lang.Double" />
</ mapping >
</ mappings >
正像你在這裡所看到的,返回型別的componentType 是一個指向<component>的引用,而不是一個類。元件型別"#someDoubles" 引用到名字為"someDoubles"的 <component>。
Aegis 將會自動給這些collections命名為ArrayOfDouble 和 ArrayOfArrayOfDouble。你也可以改變這些名字。要設定你自己的名字,提供一個"typeName" 屬性即可:
< mappings >< mapping >
< method name = "getListofListofDoubles" >
< return-type componentType = "#someDoubles" typeName = "LotsOfDoubles" />
</ method >
< component name = "someDoubles" class = "java.util.List" typeName = "SomeDoubles" componentType = "java.lang.Double" />
</ mapping >
</ mappings >
給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow
你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。新的改變
我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:
- 全新的介面設計 ,將會帶來全新的寫作體驗;
- 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
- 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
- 全新的 KaTeX數學公式 語法;
- 增加了支援甘特圖的mermaid語法1 功能;
- 增加了 多螢幕編輯 Markdown文章功能;
- 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
- 增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的建立標題,有助於目錄的生成
直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC
語法後生成一個完美的目錄。
如何改變文字的樣式
強調文字 強調文字
加粗文字 加粗文字
標記文字
刪除文字
引用文字
H2O is是液體。
210 運算結果是 1024.
插入連結與圖片
連結: link.
圖片:
帶尺寸的圖片:
當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。
如何插入一段漂亮的程式碼片
去部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片
.
// An highlighted block var foo = 'bar';
生成一個適合你的列表
- 專案
- 專案
- 專案
- 專案
- 專案1
- 專案2
- 專案3
- 計劃任務
- 完成任務
建立一個表格
一個簡單的表格是這麼建立的:
專案 | Value |
---|---|
電腦 | $1600 |
手機 | $12 |
導管 | $1 |
設定內容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文字居中 | 第二列文字居右 | 第三列文字居左 |
SmartyPants
SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
建立一個自定義列表
- Markdown
- Text-to- HTML conversion tool
- Authors
- John
- Luke
如何建立一個註腳
一個具有註腳的文字。2
註釋也是必不可少的
Markdown將文字轉換為 HTML。
KaTeX數學公式
您可以使用渲染LaTeX數學表示式 KaTeX:
Gamma公式展示 是通過尤拉積分
你可以找到更多關於的資訊 LaTeX 數學表示式here.
新的甘特圖功能,豐富你的文章
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 現有任務
已完成 :done, des1, 2014-01-06,2014-01-08
進行中 :active, des2, 2014-01-09, 3d
計劃一 : des3, after des2, 5d
計劃二 : des4, after des3, 5d
- 關於 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::
這將產生一個流程圖。:
- 關於 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支援flowchart的流程圖:
- 關於 Flowchart流程圖 語法,參考 這兒.
匯出與匯入
匯出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。
匯入
如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。
註腳的解釋 ↩︎