Fonctionnalités de la bibliothèque de l'adaptateur RPC

Mappage des résultats avec JSON/XML

Dans l'adaptateur RPC, le format de sortie est soit JSON, soit XML.

Mappage des résultats avec XML

Les diverses sorties XML qui sont générés dans des scénarios différents sont répertoriées ci-dessous.

Le type renvoyé est void

Si le type renvoyé est void, le format de sortie XML généré est une balise vide de résultat :

<results/>

Si le type de retour est primitive, wrapper ou string

Si la méthode dans le bean JavaBeans est public int getSalary(), vous obtenez un résultat de ce genre :

<results>80000</results>
Si la méthode dans le bean JavaBeans est public String getMessage(), vous obtenez un résultat de ce genre : <results>Hello World</results>
Si la méthode dans le bean JavaBeans est public Boolean isLeapYear(), vous obtenez un résultat de ce genre : <results>true</results>

Le type de retour est Collection

Pour le type de retour Collection, le résultat est un ensemble d'éléments représentant chacun une entrée de la collection. Si la collection contient une quelconque instance de type d'objet supprimé, cette entrée sera ignorée.


Si la méthode figurant dans le bean Java est public Collection getEmployees() et que le type de collection renvoyé contient des instances d'Employee, les données produites ressembleront à ceci : <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </Employee> </results> Vous pouvez spécifier un alias pour les types d'objets. Si l'alias de la classe Employee est employee, les données produites ressembleront à ceci : <results> <employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> </employee> <employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </employee> </results>

Le type de retour est Array

Pour le type de retour Array, les données générées correspondent à un ensemble d'éléments représentant chacun une entrée du tableau (array).


Si la méthode dans JavaBeans est public Employee[] getEmployees() et que le type Array renvoyé se compose d'instances d'Employee, vous obtenez un résultat de ce genre : <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> </Employee> <Employee> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </Employee> </results>

Le type de retour est un mappage

Pour les types de mappage renvoyés, les données générées sont un ensemble d'éléments représentant chacun une paire clé-valeur dans le mappage. Le nom de noeud correspond à la clé.
Si la méthode figurant dans le bean est public Map getDepartments() et que le mappage renvoyé correspond à une paire clé-valeur du code Department mappée avec les détails relatifs au département, vous obtenez un résultat de ce genre :

<results> <CS> <deptName>Science informatique</deptName> <deptHead>Dan Johns</deptName> </CS> <EC> <deptName>Electronique et communication</deptName> <deptHead>Iva Brown</deptName> </EC> </results>

Le type renvoyé est JavaBeans

Pour les types de retour beans JavaBeans, toutes les méthodes read et tous les champs public sans méthode read sont concernés par la sérialisation XML. Les JavaBeans sont représentés par un élément. Le nom nodal de cet élément sera le type de JavaBeans qu'il représente. Si vous spécifiez un alias pour le bean, c'est cet alias qui est utilisé comme nom nodal.
Si la méthode dans le bean JavaBeans est public Employee getEmployee(), vous obtenez un résultat de ce genre :

<results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> </Employee> <results> Si Employee a une référence Manager, vous obtenez un résultat de ce genre : <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </manager> </Employee> <results> Suggestion : Si l'employé a un type d'adresse champ Collection, vous obtenez un résultat de ce genre : <results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Développeur de logiciels</designation> <company>IBM</company> <manager> <firstName>John</firstName> <lastName>Dow</lastName> <designation>Manager</designation> <company>IBM</company> </manager> <addresses/> <addresses/> </Employee> <results>

Mappage des résultats avec JSON

Les différentes sorties JSON générées dans différents scénarios sont expliquées ci-après.

Le type renvoyé est void

Si le type de retour est void, les données JSON générées sont un objet de résultat JSON.

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

Si le type de retour est primitive, wrapper ou string


Si la méthode dans le bean JavaBeans est public int getSalary(), vous obtenez un résultat de ce genre : {"result":20000,"error":null,"id":1}
Si la méthode dans le bean JavaBeans est public String getMessage(), vous obtenez un résultat de ce genre : {"result":"Hello World","error":null,"id":1}
Si la méthode dans le bean JavaBeans est public Boolean isLeapYear(int year), vous obtenez un résultat de ce genre : {"result":true,"error":null,"id":1}

Le type de retour est Collection

Pour le type de retour Collection, le résultat est un ensemble d'éléments représentant chacun une entrée de la collection. Si la collection contient une quelconque instance de type d'objet supprimé, cette entrée sera ignorée.


Si la méthode figurant dans le bean JavaBeans est public Collection getEmployees() et que le type Collection renvoyé contient des instances d'Employee, vous obtenez un résultat de ce genre : {"result":[{"firstName":"James","lastName":"Smith","designation":"Développeur de logiciels","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"PDG","company":"IBM"}],"error":null,"id":1}

Le type de retour est Array

Pour le type de retour Array, les données générées correspondent à un ensemble d'éléments représentant chacun une entrée du tableau (array).


Si la méthode dans JavaBeans est public Employee[] getEmployees() et que le type Array renvoyé se compose d'instances d'Employee, vous obtenez un résultat de ce genre : {"result":[{"firstName":"James","lastName":"Smith","designation":"Développeur de logiciels","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"PDG","company":"IBM"}],"error":null,"id":1}

Le type de retour est un mappage

Pour les types de mappage renvoyés, les données générées sont un ensemble de paires clé-valeur.
Si la méthode dans le bean JavaBeans est public Map getDepartments() et que le mappage renvoyé correspond à une paire clé-valeur du code Départment mappée avec les détails relatifs au département, vous obtenez un résultat de ce genre :

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

Le type renvoyé est JavaBeans

Le bean JavaBeans est représenté sous forme de paires clé-valeur dans lesquelles la clé correspond au nom du champ et la valeur à la valeur de ce dernier. Les champs public et ceux contenant des méthodes d'accès get sont les seuls à être sérialisés.
Si la méthode dans le bean JavaBeans est public Employee getEmployee(), vous obtenez un résultat de ce genre :

{"result":{"firstName":"James","lastName":"Smith","designation":"Développeur de logiciels","company":"IBM"},"error":null,"id":1} Si Employee a une référence Manager, vous obtenez un résultat de ce genre : {"result":{"firstName":"James","lastName":"Smith","designation":"Développeur de logiciels","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1} Si l'employé a un type d'adresse champ Collection, vous obtenez un résultat de ce genre : {"result":{"firstName":"James","lastName":"Smith","designation":"Développeur de logiciels","company":"IBM","adresses":["address1","address2","address3"]},"error":null,"id":1}

Réutilisation d'instances

Il est possible de configurer l'adaptateur RPC (1) pour qu'il instancie un nouveau bean Java par demande ou (2) pour qu'il réutilise des instances par utilisateur. (Par exemple, un objet de panier électronique doit être configuré comme instance réutilisée par utilisateur.) Le comportement par défaut est d'instancier un nouveau bean JavaBeans par demande. La réutilisation est configurée à l'aide des informations du descripteur de bean. Pour les détails, voir la documentation de l'API SampleBeanInfo.

Meilleures pratiques

Présence d'une logique

Certaines commandes sont développées sans être exposées directement en tant que services. Dans de tels cas, vous pouvez développer un programme d'accès à un bean Java qui contienne la logique impliquée. Par exemple, l'EJB ShoppingCart de l'exemple de PlantsByWebSphere inclut une méthode addItem(StoreItem item). L'objet StoreItem incluant le prix de l'article, la conception présuppose que seules des sources de confiance invoqueront la méthode, comme le montre l'exemple suivant dans le servlet ShoppingServlet :

// Ajout d'un article au panier. 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) { } Notez que ShoppingServlet contient une logique qui crée une méthode virtuelle comme addItem(String itemID, String qty) de manière efficace. La même logique peut être implémentée dans le programme d'accès aux beans JavaBeans (voir exemple ci-dessous). La classe publique ShoppingCartAccessor implémente 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); } }

Schéma XML :

L'exemple suivant reproduit le schéma XML du fichier 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>

Conditions d'utilisation | Commentaires