Recursos da Biblioteca do Adaptador RPC

Mapeando Resultados para JSON/XML

No Adaptador RPC, o formato de saída é JSON ou XML.

Mapeando Resultados para XML

As diversas saídas XML geradas sob diferentes cenários são listadas a seguir.

O tipo de retorno é nulo

Se o tipo de retorno for nulo, a saída XML gerada será uma tag de resultado vazio, conforme mostrado a seguir.

<results/>

O tipo de retorno é uma primitiva, wrapper ou sequência

Se o método no JavaBeans for public int getSalary(), a saída será semelhante ao seguinte exemplo:

<results>80000</results>
Se o método no JavaBeans for public String getMessage(), a saída será semelhante ao seguinte exemplo: <results>Hello World</results>
Se o método no JavaBeans for public Boolean isLeapYear(int year), a saída será semelhante ao seguinte exemplo: <results>verdadeiro</results>

O tipo de retorno é Coleção

Para o tipo de retorno Coleta, a saída é um conjunto de elementos, com cada elemento representando uma entrada na coleta. Se a coleta tiver instâncias de um tipo de objeto suprimido, essa entrada será ignorada.


Se o método no JavaBeans for public Collection getEmployees() e a coleta retornada contiver instâncias de Employee, uma saída de amostra será semelhante ao seguinte exemplo. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Gerente</designation> <company>IBM</company> </Employee> </results> É possível especificar aliases para os tipos de objeto. Se o alias para a classe Employee for employee, a saída será semelhante ao exemplo a seguir. <results> <employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> </employee> <employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Gerente</designation> <company>IBM</company> </employee> </results>

O tipo de retorno é Matriz

Para o tipo de retorno Matriz, a saída é um conjunto de Elementos, com cada elemento representando uma entrada na matriz.


Se o método no JavaBeans for public Employee[] getEmployees() e a Matriz retornada consistir de instâncias de Employee, uma saída de amostra será semelhante ao seguinte exemplo. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Gerente</designation> <company>IBM</company> </Employee> </results>

O tipo de retorno é um Mapa

Para o tipo de retorno Mapa, a saída será um conjunto de Elementos, com cada elemento representando um par de chave-valor no mapa. O nome do nó é a chave.
Se o método no JavaBeans for public Map getDepartments() e o mapa retornado for um par de valor de chave de código de departamento para detalhes de departamento, uma saída de amostra será semelhante ao seguinte exemplo.

<results> <CS> <deptName>Informática</deptName> <deptHead>Dan Johns</deptName> </CS> <EC> <deptName>Eletroeletrônica e Comunicação</deptName> <deptHead>Iva Brown</deptName> </EC> </results>

O tipo de retorno é JavaBeans

Para o tipo de retorno JavaBeans, todos os métodos de leitura e campos públicos sem um método de leitura serão considerados para a serialização XML. Os JavaBeans são representados por um elemento. O nome do nó desse elemento será o tipo de JavaBeans que ele representa. Se qualquer alias for especificado para o bean, ele será utilizado como nome do nó.
Se o método no JavaBeans for public Employee getEmployee(), uma saída de amostra será semelhante ao seguinte exemplo:

<results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> </Employee> <results> Se o Employee tiver uma referência manager Employee, a saída de amostra será semelhante ao exemplo a seguir. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Gerente</designation> <company>IBM</company> </manager> </Employee> <results> Sugestão: Se o employee tiver um tipo de endereço de campo de coleta, a saída de amostra será semelhante ao exemplo a seguir. <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Desenvolvedor de Software</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Gerente</designation> <company>IBM</company> </manager> <addresses/> <addresses/> </Employee> <results>

Mapeando Resultados para JSON

As diversas saídas de JSON geradas em vários cenários são explicadas a seguir.

O tipo de retorno é nulo

Se o tipo de retorno for nulo, a saída de JSON gerada será um objeto de resultado JSON.

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

O tipo de retorno é uma primitiva, wrapper ou sequência


Se o método no JavaBeans for public int getSalary(), a saída será semelhante ao seguinte exemplo: {"result":20000,"error":null,"id":1}
Se o método no JavaBeans for public String getMessage(), a saída será semelhante ao seguinte exemplo: {"result":"Hello World","error":null,"id":1}
Se o método no JavaBeans for public Boolean isLeapYear(int year), a saída será semelhante ao seguinte exemplo: {"result":true,"error":null,"id":1}

O tipo de retorno é Coleção

Para o tipo de retorno Coleta, a saída é um conjunto de elementos, com cada elemento representando uma entrada na coleta. Se a coleta tiver instâncias de um tipo de objeto suprimido, essa entrada será ignorada.


Se o método no JavaBeans for public Collection getEmployees() e a coleta retornada contiver instâncias de Employee, uma saída de amostra será semelhante ao seguinte exemplo. {"result":[{"firstName":"James","lastName":"Smith","designation":"Desenvolvedor de Software","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

O tipo de retorno é Matriz

Para o tipo de retorno Matriz, a saída é um conjunto de Elementos, com cada elemento representando uma entrada na matriz.


Se o método no JavaBeans for public Employee[] getEmployees() e a Matriz retornada consistir de instâncias de Employee, uma saída de amostra será semelhante ao seguinte exemplo. {"result":[{"firstName":"James","lastName":"Smith","designation":"Desenvolvedor de Software","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

O tipo de retorno é um Mapa

Para o tipo de retorno Mapa, a saída será um conjunto de pares de chave-valor.
Se o método no JavaBeans for public Map getDepartments() e o mapa retornado for um par de valor de chave de código de departamento para detalhes de departamento, uma saída de amostra será semelhante ao seguinte exemplo.

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

O tipo de retorno é JavaBeans

Os JavaBeans são representados como pares de valor da chave com a chave com o nome do campo e o valor como o valor do campo. Apenas campos públicos e campos com getters são serializados.
Se o método no JavaBeans for public Employee getEmployee(), uma saída de amostra será semelhante ao seguinte exemplo:

{"result":{"firstName":"James","lastName":"Smith","designation":"Desenvolvedor de Software","company":"IBM"},"error":null,"id":1} Se o Employee tiver uma referência manager Employee, a saída de amostra será semelhante ao exemplo a seguir. {"result":{"firstName":"James","lastName":"Smith","designation":"Desenvolvedor de Software","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1} Se o employee tiver um tipo de endereço de campo de coleta, a saída de amostra será semelhante ao exemplo a seguir. {"result":{"firstName":"James","lastName":"Smith","designation":"Desenvolvedor de Software","company":"IBM","adresses":["address1","address2","address3"]},"error":null,"id":1}

Reutilizando Instâncias

O adaptador RPC pode ser configurado para (1) instanciar o pedido por JavaBeans ou (2) para reutilizar as instâncias por usuário. (Por exemplo, um objeto carrinho de compras poderá ser configurado como este último.) O comportamento padrão é instanciar novos JavaBeans por pedido. A reutilização é configurada por meio das informações do descritor do Bean. Consulte a documentação da API SampleBeanInfo para obter detalhes.

Práticas Recomendáveis

Lógica Contida

Alguns comandos são desenvolvidos sem a expectativa de serem expostos diretamente como serviços. Nesses casos, um acessador JavaBeans pode ser desenvolvido para conter a lógica aplicada. Por exemplo, o EJB ShoppingCart na amostra do PlantsByWebSphere inclui um método addItem(StoreItem item). O objeto StoreItem inclui o preço do item, portanto esse design presume que apenas as origens confiáveis chamarão o método, como o exemplo a seguir no servlet ShoppingServlet.

// Incluir item no carrinho de compras. 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) { } Observe que o ShoppingServlet contém lógica que efetivamente cria um método virtual como addItem(String itemID, String qty). Essa mesma lógica pode ser implementada no acessador JavaBeans como mostrado abaixo. 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", "Incluir item no carrinho de compras.", "POST", "itemId", "ID do item desejado", "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:

O exemplo a seguir é o esquema XML para o arquivo 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>

Termos de Uso | Feedback