RPC 配接器程式庫特性
- 白名單和黑名單
使用者可以在 POJO 服務中,將一組方法列為白名單或黑名單。
白名單和黑名單是利用 POJO 元素中的 methods 元素 filter 屬性來建立的。
filter 的值可能是 whitelisting 和 blacklisting。
如果未指定 filter,就會列出所有方法。
依照下列範例來指定 POJO 服務,可以將 AddressLookup 類別的 getAddress 方法列在白名單中。
AddressLookup
com.ibm.courier.AddressLookup
bean provides ...
getAddress
Gets address details
GET
範例示範只有 AddressLookup 類別的 getAddress 可以利用 RPC 配接器來存取。
相同的方法可以依照下列範例所示,列在黑名單中。
AddressLookup_BlackList
com.ibm.courier.AddressLookup
bean provides ...
getAddress
Gets address details
GET
上述範例示範除了 getAddress,利用 RPC 配接器可以存取 AddressLookup 類別的所有方法。
如果未指定 POJO 服務的方法元素,或未指定方法元素的 filter 屬性,依預設,所有方法都會列在白名單中。
- 在 POJO 方法中存取 HttpServletRequest 物件。
在許多情況下,您可能需要在從 JavaScriptTM 呼叫的方法中,存取 HttpServletRequest 物件。
在 RPC 配接器中,以 HttpServletRequest 為方法呼叫中的第一個參數,就可以完成這個動作。
傳回的簡式方法說明 (SMD) 並沒有以 HttpServletRequest 物件為參數,您無需傳遞這個參數,就可以從 JavaScript 呼叫這個方法。
例如,設想 putNameInSession(HttpServletRequest req, String name) 方法。
顯示對應的 XML 如下。
---
putNameInSession
Puts a name in session
POST
req
The HttpServletRequest object
name
The name entered by the user
您也可以利用 BeanDescriptor 描述子來指定類似的配置。
在這種情況下,Bean 提供的這個說明優先。
- 驗證器
驗證器是利用 RPC 配接器配置檔中的驗證器元素來定義。
您可以指定一組用於個別 POJO 服務的驗證器。
在呼叫方法之前,會在方法參數上呼叫指定驗證器的驗證方法。
您可以指定每個方法參數的個別驗證器。
所有驗證器都延伸抽象類別 com.ibm.websphere.rpcadapter.Validator。
另一個驗證方法是使用正規表示式。
validation-regex 元素可用來指定符合參數值的正規表示式。
如果參數值不符合正規表示式,就會建立驗證錯誤。
驗證器錯誤會造成以 JSON 格式傳回 Error 物件。
這個資訊可用來處理錯誤。
欄位說明如下。
- name:JSON-RPC 呼叫期間的錯誤,名稱為 JSONRPCError;XML-RPC 呼叫期間的錯誤,名稱為 XMLRPCError。
- code:錯誤碼。
- message:錯誤訊息。這個訊息只是詳述錯誤的訊息。
- methodName:發生錯誤的方法名稱。
- serviceName:發生錯誤的服務名稱。
- parameterIndex:驗證失敗的參數索引。非
- 驗證相關錯誤就是空值。
- parameterValue:驗證失敗的參數值。非驗證相關錯誤就是空值。
code 欄位值可以是 CWRPC0008E 和 CWRPC0009E。
- CWRPC0008E 表示方法中的參數數目不符合我們在要求中傳給它的參數數目。
- CWRPC0009E 表示基於 regex/class 的驗證失敗。
錯誤物件中的所有欄位不一定有值。
參數是根據與錯誤的相關性而設定。
名稱為 DefaultValidator 的驗證器定義如下。
regex expr1
com.ibm.websphere.rpcadapter.DefaultValidator
如果要利用預設 ID,將驗證器用於 Lookup 服務的方法參數,請在 AddressLookup POJO 服務的這個方法的參數元素中指定下列值。
Lookup
test.POJO.Lookup
method1
Gets getWhiteListedMessage
parameter1
預設值
利用逗點區隔清單,可以指定多個驗證器。
您也可以在 JavaBean 層次指定 validator-ref 標籤,以將驗證器套用於所有方法的所有引數。
在參數層次定義驗證器,可以置換這個套用於所有方法引數的驗證器。
- 物件範圍
現在,RPC 配接器支援它所顯現之物件的範圍。
RPC 配接器支援三個不同的範圍:Request、Session 和 Application,指定它們可以將顯現的物件儲存在要求、階段作業或應用程式中。
當範圍設為 Application 或 Session 時,還有一個好處是從 Session 或 Application 範圍查閱,無需每次都重建物件。
所用的索引鍵格式為 "com.ibm.websphere.rpcadapter:ServiceName",其中 ServiceName 是顯現之物件的名稱。
為了指定這個索引鍵,提供了每個物件的範圍標籤,這個標籤可能包含下列值:Session、Request 和 Application。
請參閱下列範例。
範例
com.ibm.Sample
Session
上述配置隱含從 com.ibm.Sample 實作建立的物件,會放在索引鍵為 "com.ibm.websphere.rpcadapter:Sample" 的階段作業中,其中 Sample 是 serviceName。
- 階段作業中的回覆值
現在,RPC 配接器支援新增回覆值到階段作業中。
如果要讓這個值可以新增,就必須如下所示來新增<add-to-session> 標籤。
ObjectTestTarget
test.POJO.ObjectTestTarget
應用程式
echoObject
Gets getWhiteListedMessage
jsonObject
Contains the message to be foo'd.
new
ObjectTestTarget.echoObject.returnType
add-to-session 標籤的值是索引鍵,方法的回覆值會在它之下,放在階段作業中。
- 複式物件支援
現在,RPC 配接器支援複式物件,例如:能夠包含其他物件的物件。
支援以複式物件為傳回類型或方法參數。
現在,RPC 配接器可以將任何類型的複式物件序列化。
不支援以 Maps 和 Collections 為方法呼叫的參數。
這是因為 Maps 或 Collections 所包含的物件類型,無法只從其內容來識別。
這項支援需要類別提示或參數化的類型,目前尚未支援。
另外,雖然支援複式傳回類型,但您仍無法透過 HTTP-RPC 來呼叫含有複式參數的方法。
- 遞迴物件支援
這是複式物件支援的特定案例。
例如,A -> B -> A,或 A 包含 B,B 又包含 A。
產品「RPC 配接器」元件會以 $jref(JSON 序列化)或 $xref(XML 序列化)位置保留元來取代物件的重複出現,以處理這個情況。
這些位置保留元包含可用來查閱原始物件的資訊,換言之,就是 XML 案例中的 XPath 表示式,以及 JSON 案例中的 JavaScript 表示式。
將 <recursive-object-support> 標籤值設為 true,可以開啟遞迴物件處理支援。
這顯示在下列範例中。
xml
false
true
([A-Za-z])+
com.ibm.websphere.rpcadapter.DefaultValidator
---
---
---
- 所選屬性的序列化
必須顯現的物件通常會有應用程式開發人員不想透過 JSON 或 XML Web 服務來顯現的特定欄位。
RPC 配接器所提供的功能,可抑制傳回物件中的欄位。
<serialized-params> 標籤可用來啟用這項欄位抑制功能。
以下顯示抑制 com.ibm.Address 類別之 postalCode 欄位所需要的配置。
這個配置會導致 com.ibm.Address 類別的 postalCode 欄位決不序列化。
---
---
---
com.ibm.Address
postalCode
另一個使用實務是您要抑制某類別的物件,將它排除在序列化之外,不論它包含在任何類別中,都是如此。
如果要能夠如此,您可以依照下列範例所示來配置 RPC 配接器。
---
---
---
com.ibm.Address
true
在上述範例中,當 Address 的所有實例都序列化成為 XML 時,這些實例是在 <address> 標籤中。
- 類別的別名
使用者可以指定類別的別名。
在 XML 序列化期間,會利用別名來作為節點名稱。
下列範例顯示如何配置位址的別名。
---
---
---
test.POJO.Address
address
當序列化成為 XML 時,上述範例會使 Address 的所有實例都在 <address> 標籤內。
- 類別的轉換器
使用者可以指定 JSON/XML 的轉換器。
如果指定了類別的轉換器,就會將轉換器用於這個類別的 JSON/XML 序列化。
所有轉換器類別都必須實作 com.ibm.websphere.rpcadapter.converters.IConverter
介面。
依預設,RPC 配接器隨附了下列轉換器。
|
轉換器
|
用法 |
com.ibm.websphere.rpcadapter.converters.sql.Date
|
將 java.sql.Date 轉換成日期和時間字串。
|
com.ibm.websphere.rpcadapter.converters.sql.Time
|
將 java.sql.Time 轉換成日期和時間字串。
|
com.ibm.websphere.rpcadapter.converters.sql.TimeStamp
|
將 java.sql.TimeStamp 轉換成日期和時間字串。
|
com.ibm.websphere.rpcadapter.converters.util.Date
|
將 java.util.Date 轉換成日期和時間字串。
|
您可以依照下列範例的類似方式,在 RpcAdapterConfig.xml 中指定轉換器。
您可以利用 <subclass-support> 標籤,將標籤之間的值設為 true,指定即使是所指定之 Bean 類別的子類別,轉換器類別也應該加以轉換。
依預設,這會設為 false。
xml
false
true
java.util.Date
com.ibm.websphere.rpcadapter.converters.util.Date
java.sql.Date
com.ibm.websphere.rpcadapter.converters.sql.Date
com.ibm.Parent
com.ibm.websphere.ParentConverter
true
---
---
- 啟用 JSON 註解過濾輸出
為了安全,RPC 配接器可以配置成在將方法顯現為 JSON Web 服務時,會發出 JSON 註解過濾輸出,例如:以 '/*' 和 '*/' 來包裝的 JSON 資料。Dojo 能夠在用戶端處理這個註解過濾 JSON。
依預設,在 RPCAdapter 中,會停用這個特性。
您可以依照下列範例所示,在 RpcAdapterConfig.xml 檔中,將過濾標籤設為 true 來啟用它。
xml
true
---
---
---
- 安全
RPC 配接器中的安全支援,是利用 Java EE Web 安全來實現。
所有已配置成要向用戶端顯現的服務都會有唯一 URL。
存取這些 URL 會受到使用 Java EE Web 安全的限制。
其中包括在「應用程式伺服器」中建立一個安全網域範圍,然後在部署描述子檔案 web.xml 中定義不同 URL 的角色型存取,接著再利用伺服器特定配置,將這些角色對映至安全網域範圍中的使用者或群組。
這項特性無法個別用於批次處理的呼叫。
除了「Java EE Web 安全」,RPCAdapter 也可以配置成能夠執行所顯現之服務的授權檢查,且因而只容許存取 web.xml 或 geronimo-web.xml 中所定義的特定角色。
如果要使用這個特性,您應該透過 web.xml 來維護 "/RPCAdapter/*" URL 型樣的安全。
下一步驟包括利用 <role> 標籤來指定是否只容許特定角色中的使用者存取對應的服務。
請注意,雖然 RPCAdapter 會執行服務授權,但在受到安全維護的服務接受呼叫之前,應用程式仍需負責鑑別使用者。
如果未進行鑑別,就要呼叫受到安全維護的服務,RPCAdapter 不會允許存取對應的服務。
這只適用於已列入白名單的服務其中的方法。
您可以依照下列方式來控制服務的存取。
AddressLookup
Admin
com.ibm.courier.AddressLookup
getAddress
GET
postcode
當使用這個配置時,只有 web.xml 或 geronimo-web.xml 所定義的 "Admin" 角色群組其中的使用者可以存取 AddressLookup 服務中列入白名單的方法。
- 批次
使用者可以利用 BatchService API,以批次方式處理一組呼叫。
新的批次服務 Factory 可以依照下列方式來建立、起始設定,然後提交。
var batch = new ibm.rpc.BatchService("/ContextRoot/RPCAdapter/jsonbatch");
var example = batch.createService("/ContextRoot/RPCAdapter/jsonrpc/example");
var example2 = batch.createService("/ContextRoot/RPCAdapter/jsonrpc/example2");
batch.initialize();
//在起始設定呼叫之後,會傳回批次中之服務的 SMD
example.getEcho('Hello World').addCallback(processMessage);
example2.setMessage('Hi');
batch.submit;
如果要能夠建立批次處理要求,必須在版本中提供 BatchService.js 檔,這必須複製到 "/ibm/rpc" 資料夾結構中,批次處理的呼叫才會如同 CourierApp 範例所呈現。
上述範例用來建立新批次的 URL ("/ContextRoot/RPCAdapter/jsonBatch"),是所有批次要求呼叫都指向它的 URL。
各個服務是利用 createService 函數新增到批次中。
之後,就起始設定這個批次,且會利用批次物件,將所有呼叫當作單一要求來傳送。
如果批次中某項服務的「簡式方法說明 (SMD)」載入不成功,就會連同其他載入成功的 SMD 傳送一則錯誤訊息。
您可以針對批次呼叫傳回的任何結果來指定適當的回呼。
這些呼叫是按照它們加到批次的順序來處理,結果是作為單一回應而傳回。
請注意,鑑別完批次中的所有呼叫之後,才會執行批次中的第一個呼叫。
因此,即使是批次中發出單一未獲授權的呼叫,整個批次呼叫也會失敗。
- 方法超載
您可以在 RpcAdapterConfig.xml 檔中,指定給定之超載方法的唯一名稱及對應的參數類型來顯現超載的方法。
public float add(float numa,float numb){
return (numa + numb);
}
public float add(int numa,int numb){
return (numa + numb);
}
如果要顯現兩個給定的方法,所需要的配置如下。
add
addint
Adds 2 integers
GET
numa
int
numb
int
add
addfloat
Adds 2 floating point numbers
GET
numa
float
numb
float
只有透過 RpcAdapterConfig.xml,才能支援方法超載特性。
要將超載的方法列在黑名單或白名單中,必須提及它的參數類型和唯一名稱(別名)。
超載的方法之一,可以有與其 Java 程式碼同名的別名。
之後,就可以在 JavaScript 中,利用 <name> 和 <alias> 標籤中的值來呼叫對應的方法。
- 自訂方法命名
指派給方法的名稱可以有別於 Java 實作中所用的實際名稱。
您可以按照方法超載所用的類似方式,利用 <alias> 和 <name> 標籤來完成這個動作。
唯一例外是倘若方法未超載,就不需要指定參數類型。
square
sqr
Squares the given number
GET
numa
- EJB 支援
如果要透過 RPCAdapter 來存取 Enterprise Bean,您必須在 RpcAdapterConfig.xml 中指定必要的 EJB 模組資訊。
EJB 模組中的方法會顯現出來,您可以從 JavaScript 中直接呼叫方法。
Session Bean
如果要透過 RPCAdapter 來存取 Session Bean,請指定遠端和本端介面、用於 EJB 模組查閱的 JNDI 名稱,以及實作的方法。
如果是 EJB 3.0,會用通常稱為商業界面的單一介面來取代遠端和本端介面。
因此,請利用 <business-interface> 標籤來指定商業介面。
<ejb-name> 標籤用來將邏輯名稱關聯於 EJB 模組。
<jndi-name> 用來查閱 EJB 模組。
使用者在 RpcAdapterConfig.xml 檔中指定的 JNDI 名稱,必須符合 web.xml 檔所指定的 JNDI 名稱。
如果是 EJB 3.0,且所用的「應用程式伺服器」是 WebSphere® Application Server Community Edition,請在 JNDI 名稱前面附加 "java:comp/env/" 字首。
如果是 WebSphere Application Server,且使用 EJB 3.0,在 <jndi-name> 標籤內的 JNDI 名稱,字首必須是 "ejblocal:" 關鍵字。
您必須利用 <session-type> 標籤來提供 Session Bean 的類型,stateless 或 stateful。
下列範例顯示 RpcAdapterConfig.xml 中的 Stateless Session Bean 範例項目。
範例
test.TestSample
test.TestSampleHome
ejb/TestSampleSession
Stateless
sayHello
bean provides..
GET
name
在 Stateful Session Bean 中,Home 介面可以包含多個 create 函數。
在這種情況下,請指定要呼叫的 create 函數。
請利用 <create> 標籤,在 RpcAdapterConfig.xml 檔中宣告 create 函數。
以下是 EJB 2.1 的 Stateful Session Bean 程式碼 Snippet。
範例
test.TestSample
test.TestSampleHome
name
ejb/TestSampleSession
Stateful
----
-----
------
EJB 中的遠端查閱
在 RPCAdapter 中,也支援 EJB 模組的遠端查閱。
請將 <ejb> 的 remote 屬性設為 true,然後提供遠端查閱所要設定的必要內容。
內容併在 <configuration> 標籤之下。
以下是 RpcAdapterConfig.xml 檔中的遠端查閱範例程式碼 Snippet。
test.TestSample
test.TestSampleHome
ejb/TestSampleSession
org.openejb.client.RemoteInitialContextFactory
system
manager
localhost:4201
Stateless
----
-----
-------
在 Stateful Session Bean 中,特定 Session Bean 只有一個實例存在。
如果相同 Session Bean 有兩個實例,新實例會取代舊實例。
- 註釋支援
註釋支援可讓您直接從程式碼顯現您的服務,而不是在 RpcAdapterConfig.xml 檔中配置它們。
為了啟用這個特性,這個版本提供了 RPCAdapter-annotation.jar 檔。
請利用這個特性,將這個 jar 檔放在 Web 應用程式的 WEB-INF/lib 目錄中。
您應該利用 @Pojo 來標註含有將顯現之方法的類別;利用 @Method 和 @Params 註釋來標註對應的方法。
透過 web.xml 檔,可讓 RPCAdapter 見到標註的類別。
請將所標註之類別的標準名稱當作 "init-param" 值來指定給 RPCAdapter。
請以 classn 來提及對應的 "init-param" 名稱,其中 n 是任何數字。
以下是範例程式碼 Snippet。
RPCAdapter
RPCAdapter
com.ibm.websphere.rpcadapter.RPCAdapter
Class1
com.ibm.courier.AddressLookup
上述配置可確保會處理 AddressLookup 類別的註釋。
您可以依照以下所說明,利用兩種方式來透過註釋建立 Pojo 元素。
- 類別顯現為單一 Pojo 元素
- 類別顯現為多重 Pojo 元素
單一 Pojo 元素
對應的類別是用 @Pojo 來標註。
以下是範例程式碼 Snippet。
@Pojo(name = "AddressLookup", description = "bean provides ...", id = "1", filter = "whitelisting")
public class AddressLookup {
@Params(name = {"postcode"})
@Method(name = "getAddress", description = "Gets address", id = "1")
public String getAddress(String postcode){
...
...
}
@Params(name = "name")
@Method(name = "validate", description = "Validates name", id = "1")
public void validate(String name){
...
...
}
}
@Pojo 註釋有下列屬性,它們並非全都必要
- Name:必要
- ID:必要
- Description:選用
- ValRef:選用
- Filter:選用,依預設,會採用「白名單」。
- Scope:選用
@Method 註釋有下列屬性,它們並非全都必要。
- Name:必要
- ID:必要
- Description:選用
- HttpMethod:選用,依預設,它是 GET
- AddToSession:選用
- SecurityRoles:選用
@Params 註釋有下列屬性,它們並非全都必要
- Name:必要。這是方法之所有參數名稱的字串陣列
- Description:選用
- ValidatorRef:選用
相同類別中的多重 Pojo 元素
類別用 @Pojos 註釋來標註。
在這個案例中,在將方法關聯於類別的 Pojo 實作時,'id' 屬性扮演很重要的角色。
當 Pojo 和 Method 的 'id' 屬性相符時,方法就會關聯於這個 Pojo 實作。
以下是範例程式碼 Snippet。
@Pojos(pojo = {@Pojo(name = "AddressLookup", description = "bean provides ...", id = "1"), @Pojo(name = "AddressLookup_Blacklisting", description = "the method is not visible", id = "2", filter = "blacklisting")})
public class AddressLookup {
@Params(name = {"postcode"})
@Method(name = "getAddress", description = "Gets address", id = "1")
public String getAddress(String postcode){
...
...
}
@Params(name = "name")
@Method(name = "validate", description = "Validates name", id = "1")
public void validate(String name){
...
...
}
@Method(name = "testBlackListing", description = "testBlackListing Method", id = "2")
public Address testBlackListing(){
...
...
}
}
現在,'getAddress' 和 'validate' 方法關聯於 Pojo AddressLookup,因為它們的 id 相符。
同樣地,testBlackListing 方法關聯於 AddressLookup_Blacklisting Pojo。
@Pojos 註釋有下列屬性
- pojo - 必要。這是一個 @Pojo 註釋陣列
附註:「註釋支援」只適用於 Java 5.0 和 Java 6.0 的使用者。
目前,只支援這些註釋。
其餘元素的支援應該透過 RpcAdapterConfig.xml 檔來提供。
將結果對映至 JSON/XML
在 RPC 配接器中,輸出格式是 JSON 或 XML。
將結果對映至 XML
以下列出在不同實務之下產生的各種 XML 輸出。
傳回類型是 void
如果傳回類型是 void,產生的 XML 輸出就是如下所示的空白結果標籤。
傳回類型是 primitive、wrapper 或 string
如果 JavaBean 中的方法是 public int getSalary()
,就會有類似下列輸出:
80000
如果 JavaBean 中的方法是 public String getMessage()
,輸出會類似下列範例。
Hello World
如果 JavaBean 中的方法是 public Boolean isLeapYear(int year)
,輸出會類似下列範例。
true
傳回類型是 Collection
如果傳回類型是 Collection,輸出就是一組元素,每個元素都代表集合中的一個項目。
如果集合含有抑制之物件類型的任何實例,就會忽略這個項目。
如果 JavaBean 中的方法是 public Collection getEmployees()
,傳回的集合包含 Employee 的實例,就會有一個類似下列範例的範例輸出。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
您可以指定物件類型的別名。
如果 Employee 類別的別名是 employee,輸出會類似下列範例。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
傳回類型是 Array
如果傳回類型是 Array,輸出就是一組元素,每個元素都代表陣列中的一個項目。
如果 JavaBean 中的方法是 public Employee[] getEmployees()
,且傳回的 Array 由 Employee 的實例組成,就會有一個範例輸出類似下列範例。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
傳回類型是 Map
如果傳回類型是 Map,輸出就是一組元素,每個元素都代表對映中的一個鍵值組。節點名稱是索引鍵。
如果 JavaBean 中的方法是 public Map getDepartments()
,且傳回的對映是部門碼至部門詳細資料的鍵值組,就會有一個類似下列範例的範例輸出。
Computer Science
Dan Johns
Electronics and Communication
Iva Brown
傳回類型是 JavaBean
如果傳回類型是 JavaBean,所有讀取方法及無讀取方法的公用欄位都會考慮採用 XML 序列化。
JavaBean 用元素來表示。
這個元素的節點名稱將是它代表的 JavaBean 類型。
如果 Bean 指定了任何別名,就會用來作為節點名稱。
如果 JavaBean 中的方法是 public Employee getEmployee()
,就會有一個類似下列範例的範例輸出。
James
Smith
Software Developer
IBM
如果 Employee 有一個經理 Employee 參照,範例輸出會類似於下列範例。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
建議:
如果員工有一個地址類型集合欄位,範例輸出會類似於下列範例。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
將結果對映至 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 綱目。
|