RPC 配接器程式庫特性

將結果對映至 JSON/XML

在 RPC 配接器中,輸出格式是 JSON 或 XML。

將結果對映至 XML

以下列出在不同實務之下產生的各種 XML 輸出。

傳回類型是 void

如果傳回類型是 void,產生的 XML 輸出就是如下所示的空白結果標籤。

<results/>

傳回類型是 primitive、wrapper 或 string

如果 JavaBean 中的方法是 public int getSalary(),就會有類似下列輸出:

<results>80000</results>
如果 JavaBean 中的方法是 public String getMessage(),輸出會類似下列範例。 <results>Hello World</results>
如果 JavaBean 中的方法是 public Boolean isLeapYear(int year),輸出會類似下列範例。 <results>true</results>

傳回類型是 Collection

如果傳回類型是 Collection,輸出就是一組元素,每個元素都代表集合中的一個項目。 如果集合含有抑制之物件類型的任何實例,就會忽略這個項目。


如果 JavaBean 中的方法是 public Collection getEmployees(),傳回的集合包含 Employee 的實例,就會有一個類似下列範例的範例輸出。 <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </Employee> </results> 您可以指定物件類型的別名。 如果 Employee 類別的別名是 employee,輸出會類似下列範例。 <results> <employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> </employee> <employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </employee> </results>

傳回類型是 Array

如果傳回類型是 Array,輸出就是一組元素,每個元素都代表陣列中的一個項目。


如果 JavaBean 中的方法是 public Employee[] getEmployees(),且傳回的 Array 由 Employee 的實例組成,就會有一個範例輸出類似下列範例。 <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </Employee> </results>

傳回類型是 Map

如果傳回類型是 Map,輸出就是一組元素,每個元素都代表對映中的一個鍵值組。節點名稱是索引鍵。
如果 JavaBean 中的方法是 public Map getDepartments(),且傳回的對映是部門碼至部門詳細資料的鍵值組,就會有一個類似下列範例的範例輸出。

<results> <CS> <deptName>Computer Science</deptName> <deptHead>Dan Johns</deptName> </CS> <EC> <deptName>Electronics and Communication</deptName> <deptHead>Iva Brown</deptName> </EC> </results>

傳回類型是 JavaBean

如果傳回類型是 JavaBean,所有讀取方法及無讀取方法的公用欄位都會考慮採用 XML 序列化。 JavaBean 用元素來表示。 這個元素的節點名稱將是它代表的 JavaBean 類型。 如果 Bean 指定了任何別名,就會用來作為節點名稱。
如果 JavaBean 中的方法是 public Employee getEmployee(),就會有一個類似下列範例的範例輸出。

<results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> </Employee> <results> 如果 Employee 有一個經理 Employee 參照,範例輸出會類似於下列範例。 <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </manager> </Employee> <results> 建議: 如果員工有一個地址類型集合欄位,範例輸出會類似於下列範例。 <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </manager> <addresses/> <addresses/> </Employee> <results>

將結果對映至 JSON

以下說明在各種實務之下產生的各種 JSON 輸出。

傳回類型是 void

如果傳回類型是 void,產生的 JSON 輸出就是 JSON 結果物件。

{"result":null,"error":null,"id":1}

傳回類型是 primitive、wrapper 或 string


如果 JavaBean 中的方法是 public int getSalary(),輸出會類似下列範例。 {"result":20000,"error":null,"id":1}
如果 JavaBean 中的方法是 public String getMessage(),輸出會類似下列範例。 {"result":"Hello World","error":null,"id":1}
如果 JavaBean 中的方法是 public Boolean isLeapYear(int year),輸出會類似下列範例。 {"result":true,"error":null,"id":1}

傳回類型是 Collection

如果傳回類型是 Collection,輸出就是一組元素,每個元素都代表集合中的一個項目。 如果集合含有抑制之物件類型的任何實例,就會忽略這個項目。


如果 JavaBean 中的方法是 public Collection getEmployees(),傳回的集合包含 Employee 的實例,就會有一個類似下列範例輸出。 {"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

傳回類型是 Array

如果傳回類型是 Array,輸出就是一組元素,每個元素都代表陣列中的一個項目。


如果 JavaBean 中的方法是 public Employee[] getEmployees(),且傳回的 Array 由 Employee 的實例組成,就會有一個範例輸出類似下列範例。 {"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

傳回類型是 Map

如果傳回類型是 Map,輸出將是一組鍵值組。
如果 JavaBean 中的方法是 public Map getDepartments(),且傳回的對映是部門碼至部門詳細資料的鍵值組,就會有一個類似下列範例的範例輸出。

{"result":[{"deptName":"name1","deptHead":"head1"},{"deptName":"name2","deptHead":"head2"}],"error":null,"id":1}

傳回類型是 JavaBean

JavaBean 表現為一個鍵值組,索引鍵作為欄位名稱,值作為欄位值。 只有公用欄位及含 getter 的欄位會序列化。
如果 JavaBean 中的方法是 public Employee getEmployee(),就會有類似下列範例的範例輸出。

{"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},"error":null,"id":1} 如果 Employee 有一個經理 Employee 參照,範例輸出會類似於下列範例。 {"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1} 如果員工有一個地址類型集合欄位,範例輸出會類似於下列範例。 {"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","adresses":["address1","address2","address3"]},"error":null,"id":1}

重複使用實例

您可以配置 RPC 配接器來 (1) 每個要求各建立一個 JavaBean 實例,或 (2) 每個要求都重複使用實例。 (例如,購物車物件有可能稍後再配置。) 預設行為是每個要求都建立新的 JavaBean 實例。 重複使用是利用 Bean 描述子資訊來配置。 請參閱 SampleBeanInfo API 文件,以取得詳細資料。

最佳作法

包含邏輯

開發某些指令時,並未預期將它們直接顯現為服務。 在這種情況下,可以開發 JavaBean 存取元來包含隱含的邏輯。 例如,PlantsByWebSphere 範例中的 ShoppingCart EJB 包括 addItem(StoreItem item) 方法。 StoreItem 物件包括項目價格,因此,這個設計假定只有授信來源才會呼叫這個方法,例如 ShoppingServlet Servlet 中的下列範例:

// 新增項目到購物車中。 if (shoppingCart != null) { String invID = req.getParameter("itemID"); try { Catalog catalog = catalogHome.create(); StoreItem si = catalog.getItem(invID); si.setQuantity(Integer.parseInt(req.getParameter("qty").trim())); shoppingCart.addItem(si); } catch (javax.ejb.CreateException e) { } 請注意,ShoppingServlet 包含能夠有效建立 addItem(String itemID, String qty) 之類虛擬方法的邏輯。 在 JavaBean 存取元中,也可以實作相同的邏輯,如下所示。 public class ShoppingCartAccessor implements SelfBeanInfo { private static ShoppingCartHome _home = (ShoppingCartHome) Util.getEJBHome("java:comp/env/ejb/ShoppingCart", com.ibm.websphere.samples.plantsbywebsphereejb.ShoppingCartHome.class); private ShoppingCart _bean; public static String[][] getBeanDescriptorInfo() { String [][] descriptor = { {"bean", "storeInSession", "true"}, {"method", "addItem", "Add item to the shopping cart.", "POST", "itemId", "ID of the desired item", "quantity", "number of items"}, }; return(descriptor); } public ShoppingCartAccessor() throws RemoteException, CreateException { _bean = _home.create(); } public void addItem(String invID, int quantity) throws RemoteException { CatalogAccessor catalog; try { catalog = new CatalogAccessor(); } catch (CreateException e) { throw new RemoteException(e.getMessage(), e); } StoreItem si = catalog.getItem(invID); si.setQuantity(quantity); _bean.addItem(si); } }

XML 綱目:

下列範例是 RpcAdapterConfig.xml 檔的 XML 綱目。 <xsd:schema xmlns="http://www.ibm.com/xmlns/prod/websphere/featurepack/v6.1/RpcAdapterConfig" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com/xmlns/prod/websphere/featurepack/v6.1/RpcAdapterConfig" elementFormDefault="qualified"> <xsd:element name="services"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="unbounded" ref="POJO"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="description" type="xsd:string"/> <xsd:element name="scope"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Application" /> <xsd:enumeration value="Session" /> <xsd:enumeration value="Request" /> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="validation-regex" type="xsd:string"/> <xsd:element name="validator-ref" type="xsd:string"/> <xsd:element name="default-format" type="xsd:string"/> <xsd:element name="filtered" type="xsd:string"/> <xsd:element name="recursive-object-support" type="xsd:string"/> <xsd:element name="validator"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" ref="validation-regex"/> <xsd:element minOccurs="1" ref="validation-class"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> <xsd:element name="bean-class" type="xsd:string"/> <xsd:element name="converter-class" type="xsd:string"/> <xsd:element name="converter"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" ref="bean-class"/> <xsd:element minOccurs="1" ref="converter-class"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="implementation" type="xsd:string"/> <xsd:element name="methods"> <xsd:complexType> <xsd:sequence> <xsd:element ref="method" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="filter" type="xsd:string"/> </xsd:complexType> </xsd:element> <xsd:element name="name" type="xsd:string"/> <xsd:element name="parameters"> <xsd:complexType> <xsd:sequence> <xsd:element ref="parameter" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="rpcAdapter"> <xsd:complexType> <xsd:sequence> <xsd:element ref="default-format" minOccurs="0"/> <xsd:element minOccurs="0" ref="filtered" maxOccurs="1" /> <xsd:element minOccurs="0" ref="recursive-object-support" maxOccurs="1" /> <xsd:element minOccurs="0" ref="converters" maxOccurs="1" /> <xsd:element minOccurs="0" ref="validators" maxOccurs="1" /> <xsd:element minOccurs="1" ref="services" maxOccurs="1"/> <xsd:element minOccurs="0" ref="serialized-params" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="parameter"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" ref="name"/> <xsd:element minOccurs="0" ref="description"/> <xsd:element minOccurs="0" ref="validator-ref"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="http-method" type="xsd:string"/> <xsd:element name="validation-class" type="xsd:string"/> <xsd:element name="POJO"> <xsd:complexType> <xsd:sequence> <xsd:element ref="name"/> <xsd:element ref="implementation"/> <xsd:element minOccurs="0" ref="description"/> <xsd:element ref="scope" minOccurs="0"/> <xsd:element minOccurs="0" ref="validator-ref"/> <xsd:element minOccurs="0" ref="methods"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="serialized-param-type" type="xsd:string"/> <xsd:element name="suppress" type="xsd:string"/> <xsd:element name="alias" type="xsd:string"/> <xsd:element name="suppressed-field" type="xsd:string"/> <xsd:element name="suppressed-fields"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" ref="suppressed-field" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="serialized-param"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" ref="serialized-param-type"/> <xsd:element minOccurs="0" ref="suppress"/> <xsd:element minOccurs="0" ref="alias"/> <xsd:element minOccurs="0" ref="suppressed-fields"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="serialized-params"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" ref="serialized-param" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="add-to-session" type="xsd:string"/> <xsd:element name="method"> <xsd:complexType> <xsd:sequence> <xsd:element ref="name"/> <xsd:element minOccurs="0" ref="description"/> <xsd:element minOccurs="0" ref="http-method"/> <xsd:element minOccurs="0" ref="parameters"/> <xsd:element minOccurs="0" ref="add-to-session"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="validators"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" ref="validator" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="converters"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" ref="converter" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

使用條款 | 意見