Características de la biblioteca de adaptadores RPC

Correlación de resultados con JSON/XML

En un adaptador RPC, el formato de salida es JSON o XML.

Correlación de resultados con XML

A continuación se listan las diversas salidas XML que se generan bajo distintos casos de ejemplo.

El tipo de retorno es void

Si el tipo de retorno es void, la salida XML generada es un código de resultado vacío como se muestra a continuación.

<results/>

El tipo de retorno es un primitivo, una envoltura o una serie

Si el método de JavaBeans es public int getSalary(), la salida es parecida a la siguiente:

<results>80000</results>
Si el método de JavaBeans es public String getMessage() , la salida es parecida a la del ejemplo siguiente. <results>Hello World</results>
Si el método de JavaBeans es public Boolean isLeapYear(int year), la salida es parecida a la del ejemplo siguiente. <results>true</results>

El tipo de retorno es Colección

Para el tipo de retorno Colección, la salida es un conjunto de elementos donde cada elemento representa una entrada en la colección. Si la colección contiene alguna instancia de un tipo de objeto suprimido, dicha entrada se ignora.


Si el método de JavaBeans es public Collection getEmployees() y la colección devuelta contiene instancias de Employee, una salida de ejemplo es parecida a la del ejemplo siguiente. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Director</designation> <company>IBM</company> </Employee> </results> Puede especificar un alias para los tipos de objeto. Si el alias de la clase Employee es employee, la salida será como el siguiente ejemplo: <results> <employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> </employee> <employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Director</designation> <company>IBM</company> </employee> </results>

El tipo de retorno es Array

Para el tipo de retorno Array, la salida es un conjunto de elementos donde cada elemento representa una entrada en la matriz.


Si el método de JavaBeans es public Employee[] getEmployees() y la matriz (Array) devuelta está compuesta por instancias de Employee, una salida de ejemplo es parecida a la del ejemplo siguiente. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Director</designation> <company>IBM</company> </Employee> </results>

El tipo de retorno es una Correlación

Para el tipo de retorno Correlación, la salida será un conjunto de elementos, donde cada elemento representa un par de clave-valor en la correlación. El nombre de nodo es la clave.
Si el método de JavaBeans es public Map getDepartments() y la correlación devuelta en un par clave-valor de código de departamento a detalles de departamento, una salida de ejemplo es parecida a la del ejemplo siguiente.

<results> <CS> <deptName>Técnico en sistemas</deptName> <deptHead>Dan Johns</deptName> </CS> <EC> <deptName>Electrónica y comunicaciones</deptName> <deptHead>Iva Brown</deptName> </EC> </results>

El tipo de retorno es JavaBeans

Para el tipo de retorno de JavaBeans todos los métodos de lectura y los campos públicos sin un método de lectura se considerarán para la serialización XML. Los JavaBeans se representan por un elemento. El nombre de nodo de este elemento será del tipo de JavaBeans que representa. Si se especifica un alias para el bean, se utilizará como nombre de nodo.
Si el método de JavaBeans es public Employee getEmployee() , una salida de ejemplo es parecida a la siguiente.

<results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> </Employee> <results> Si el empleado tiene una referencia de empleado de director, la salida de ejemplo será parecida a la siguiente: <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Director</designation> <company>IBM</company> </manager> </Employee> <results> Sugerencia: si el empleado tiene un tipo de dirección de campo de colección, la salida de ejemplo es parecida a la siguiente. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desarrollador de software</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Director</designation> <company>IBM</company> </manager> <addresses/> <addresses/> </Employee> <results>

Correlación de resultados con JSON

A continuación se explican las diversas salidas JSON en distintos casos de ejemplo.

El tipo de retorno es void

Si el tipo de retorno es void, la salida JSON generada es un objeto de resultado JSON.

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

El tipo de retorno es un primitivo, una envoltura o una serie


Si el método de JavaBeans es public int getSalary() , la salida es parecida al siguiente ejemplo. {"result":20000,"error":null,"id":1}
Si el método de JavaBeans es public String getMessage() , la salida es parecida a la del ejemplo siguiente. {"result":"Hello World","error":null,"id":1}
Si el método de JavaBeans es public Boolean isLeapYear(int year), la salida es parecida a la del ejemplo siguiente. {"result":true,"error":null,"id":1}

El tipo de retorno es Colección

Para el tipo de retorno Colección, la salida es un conjunto de elementos donde cada elemento representa una entrada en la colección. Si la colección contiene alguna instancia de un tipo de objeto suprimido, dicha entrada se ignora.


Si el método de JavaBeans es public Collection getEmployees() y la colección devuelta contiene instancias de Employee, una salida de ejemplo es parecida a la del ejemplo siguiente. {"result":[{"firstName":"James","lastName":"Smith","designation":"Desarrollador de software","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

El tipo de retorno es Array

Para el tipo de retorno Array, la salida es un conjunto de elementos donde cada elemento representa una entrada en la matriz.


Si el método de JavaBeans es public Employee[] getEmployees() y la matriz (Array) devuelta está compuesta por instancias de Employee, una salida de ejemplo es parecida a la del ejemplo siguiente. {"result":[{"firstName":"James","lastName":"Smith","designation":"Desarrollador de software","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

El tipo de retorno es una Correlación

Para el tipo de retorno Correlación, la salida será un conjunto de pares de clave-valor.
Si el método de JavaBeans es public Map getDepartments() y la correlación devuelta en un par clave-valor de código de departamento a detalles de departamento, una salida de ejemplo es parecida a la del ejemplo siguiente.

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

El tipo de retorno es JavaBeans

Los JavaBeans se representan como pares de clave-valor con la clave como nombre del campo y el valor como valor del campo. Sólo se serializan los campos públicos y los campos con métodos getter.
Si el método de JavaBeans es public Employee getEmployee() , una salida de ejemplo es parecida a la siguiente.

{"result":{"firstName":"James","lastName":"Smith","designation":"Desarrollador de software","company":"IBM"},"error":null,"id":1} Si el empleado tiene una referencia de empleado de director, la salida de ejemplo será parecida a la siguiente: {"result":{"firstName":"James","lastName":"Smith","designation":"Desarrollador de software","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1} Si el empleado tiene un tipo de direcciones de campo de colección, la salida de ejemplo es parecida a la siguiente. {"result":{"firstName":"James","lastName":"Smith","designation":"Desarrollador de software","company":"IBM","adresses":["dirección1","dirección2","dirección3"]},"error":null,"id":1}

Volver a utilizar instancias

El adaptador RPC puede configurarse para (1) crear una instancia de JavaBeans por petición o (2) reutilizar instancias por usuario. (Por ejemplo, puede configurarse un carro de la compra como la segunda opción). El comportamiento predeterminado es crear una instancia de un nuevo JavaBeans por petición. La reutilización se configura mediante la información del descriptor de bean. Consulte la documentación de la API SampleBeanInfo para obtener detalles.

Procedimientos recomendados

Lógica contenida

Algunos mandatos se desarrollan sin la expectativa de exponerse directamente como servicios. En casos así, un descriptor de acceso JavaBeans se puede desarrollar para contener la lógica implicada. Por ejemplo, el EJB ShoppingCart en el ejemplo PlantsByWebSphere incluye un método addItem(StoreItem item). El objeto StoreItem incluye el precio del artículo, por lo que este diseño se supone que sólo las fuentes invocarán el método, como el siguiente ejemplo en el servlet ShoppingServlet.

// Añadir un artículo al carro. 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) { } Tenga en cuenta que el ShoppingServlet contiene una lógica que crea de manera eficaz un método virtual como addItem(String itemID, String qty). Esa misma lógica puede implementarse en el descriptor de acceso JavaBeans como se puede ver a continuación. 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); } }

Esquema XML:

El siguiente ejemplo es el esquema XML para el archivo RPCAdapterConfig.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>

Condiciones de uso | Comentarios