RPC 适配器库功能部件

将结果映射至 JSON/XML

在 RPC 适配器中,输出格式为 JSON 或 XML。

将结果映射至 XML

下面列示不同情况下生成的各种 XML 输出。

返回类型为空

如果返回类型为 void,那么生成的 XML 输出将是空结果标记,如下所示。

<results/>

返回类型为原语、包装程序或字符串

如果 JavaBeans 中的方法为 public int getSalary(),那么输出将与以下示例类似:

<results>80000</results>
如果 JavaBeans 中的方法为 public String getMessage(),那么输出将与以下示例类似。 <results>Hello World</results>
如果 JavaBeans 中的方法为 public Boolean isLeapYear(int year),那么输出将与以下示例类似。 <results>true</results>

返回类型为集合

如果返回类型为集合,那么输出是一组元素,并且每个元素都表示集合中的一个条目。如果该集合包含已被抑制的对象类型的任何实例,那么该条目将被忽略。


如果 JavaBeans 中的方法为 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>

返回类型为数组

如果返回类型为数组,那么输出是一组元素,并且每个元素都表示该数组中的一个条目。


如果 JavaBeans 中的方法为 public Employee[] 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>

返回类型为映射

如果返回类型为映射,那么输出是一组元素,并且每个元素都表示该映射中的一个键值对。节点名为键。
如果 JavaBeans 中的方法为 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>

返回类型为 JavaBeans

如果返回类型为 JavaBeans,那么将对所有 read 方法以及没有 read 方法的公用字段进行 XML 序列化。JavaBeans 由元素表示。此元素的节点名将是它所表示的 JavaBeans 的类型。如果对该 Bean 指定了任何别名,那么此别名将用作节点名。
如果 JavaBeans 中的方法为 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,那么生成的 JSON 输出将为 JSON 结果对象。

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

返回类型为原语、包装程序或字符串


如果 JavaBeans 中的方法为 public int getSalary(),那么输出将与以下示例类似。 {"result":20000,"error":null,"id":1}
如果 JavaBeans 中的方法为 public String getMessage(),那么输出将与以下示例类似。 {"result":"Hello World","error":null,"id":1}
如果 JavaBeans 中的方法为 public Boolean isLeapYear(int year),那么输出将与以下示例类似。 {"result":true,"error":null,"id":1}

返回类型为集合

如果返回类型为集合,那么输出是一组元素,并且每个元素都表示集合中的一个条目。如果该集合包含已被抑制的对象类型的任何实例,那么该条目将被忽略。


如果 JavaBeans 中的方法为 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}

返回类型为数组

如果返回类型为数组,那么输出是一组元素,并且每个元素都表示该数组中的一个条目。


如果 JavaBeans 中的方法为 public Employee[] getEmployees(),并且返回的数组包含 Employee 实例,那么样本输出将与以下示例类似。 {"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

返回类型为映射

如果返回类型为映射,那么输出将是一组键值对。
如果 JavaBeans 中的方法为 public Map getDepartments(),并且返回的映射是部门详细信息的部门代码的键值对,那么样本输出将与以下示例类似。

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

返回类型为 JavaBeans

JavaBeans 表示成键值对,其中,键是字段的名称,值是字段的值。将只对公用字段以及带有 getter 方法的字段进行序列化。
如果 JavaBeans 中的方法为 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) 对于每个请求,将 JavaBeans 实例化;(2) 对于每个用户,复用实例。(例如,可以将购物车对象配置为后一种情况。)缺省行为是,对于每个请求都实例化新的 JavaBeans。复用功能是通过 Bean 描述符信息来配置的。有关详细信息,请参阅 SampleBeanInfo API 文档。

最佳做法

包含逻辑

在开发某些命令时,并没有期望将它们直接作为服务来呈示。在此类情况下,可以开发一个 JavaBeans 的访问器来包含隐含的逻辑。例如,PlantsByWebSphere 样本中的 ShoppingCart EJB 就包含 addItem(StoreItem item) 方法。StoreItem 对象包含商品价格,因此,此设计假定只有可信源才会调用该方法,例如 ShoppingServlet Servlet 中的以下示例。

// Add item to cart. 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))的逻辑。可以在 JavaBeans 访问器中实现该逻辑,如下所示。 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>

使用条款 | 反馈