Features der RPC-Adapterbibliothek

Ergebnisse JSON/XML zuordnen

Das Ausgabeformat des RPC-Adapters ist JSON oder XML.

Zuordnung von Ergebnissen zu XML

Die verschiedenen XML-Ausgaben, die in den verschiedenen Szenarios generiert werden, sind im Folgenden aufgelistet.

Rückgabetyp ist "void"

Beim Rückgabetyp "void" ist die generierte XML-Ausgabe, wie im Folgenden gezeigt, ein leeres Ergebnis-Tag.

<results/>

Rückgabetyp ist ein primitives Element, ein Wrapper oder eine Zeichenfolge

Wenn die Methode in der JavaBeans public int getSalary() ist, gleicht die Ausgabe dem folgenden Beispiel:

<results>80000</results>
Wenn die Methode in der Java-Bean public String getMessage() ist, gleicht die Ausgabe dem folgenden Beispiel: <results>Hello World</results>
Wenn die Methode in der Java-Bean public Boolean isLeapYear(int year) ist, gleicht die Ausgabe dem folgenden Beispiel: <results>true</results>

Rückgabetyp ist eine Datensammlung

Wenn der Rückgabetyp eine Datensammlung (Collection) ist, besteht die Ausgabe aus einer Reihe von Elementen, die jeweils einen Eintrag der Datensammlung repräsentieren. Enthält die Datensammlung Instanzen eines unterdrückten Objekttyps, wird dieser Eintrag ignoriert.


Wenn die Methode in der Java-Bean public Collection getEmployees() ist und die zurückgegebene Datensammlung Instanzen von Employee enthält, gleicht die Ausgabe dem folgenden Beispiel: <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> Sie können einen Alias für die Objekttypen angeben. Die Ausgabe gleicht dem folgenden Beispiel, wenn "employee" der Alias für die Klasse "Employee" ist: <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>

Rückgabetyp ist ein Array

Wenn der Rückgabetyp ein Array ist, besteht die Ausgabe aus einer Reihe von Elementen, die jeweils einen Eintrag im Array repräsentieren.


Wenn die Methode in der Java-Bean public Employee[] getEmployees() ist und der zurückgegebene Bereich aus Instanzen von "Employee" besteht, gleicht die Ausgabe dem folgenden Beispiel: <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>

Rückgabetyp ist eine Zuordnung

Wenn der Rückgabetyp eine Zuordnung (Map) ist, besteht die Ausgabe aus einer Reihe von Elementen, die jeweils ein Schlüssel-Wert-Paar der Zuordnung repräsentieren. Der Knotenname ist der Schlüssel.
Wenn die Methode in der Java-Bean public Map getDepartments() ist und die zurückgegebene Zuordnung ein Schlüssel-Wert-Paar mit Abteilungscode und Abteilungsdetails ist, gleicht die Ausgabe dem folgenden Beispiel:

<results> <CS> <deptName>Computer Science</deptName> <deptHead>Dan Johns</deptName> </CS> <EC> <deptName>Electronics and Communication</deptName> <deptHead>Iva Brown</deptName> </EC> </results>

Rückgabetyp ist JavaBeans

Wenn der Rückgabetyp "JavaBeans" ist, werden bei der XML-Serialisierung alle read-Methoden und öffentlichen Felder ohne read-Methode berücksichtigt. Die Java-Bean wird durch ein Element dargestellt. Der Knotenname dieses Elements ist der Typ der dargestellten Java-Bean. Falls für die Bean ein Alias angegeben ist, wird dieser als Knotenname verwendet.
Wenn die Methode in der Java-Bean public Employee getEmployee() ist, gleicht die Ausgabe dem folgenden Beispiel:

<results> <Employee> <firstName>James</firstName> <lastName>Smith</lastName> <designation>Software Developer</designation> <company>IBM</company> </Employee> <results> Falls es für den Mitarbeiter (Employee) eine Managerreferenz gibt, gleicht die Ausgabe dem folgenden Beispiel: <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> Empfehlung: Wenn der Mitarbeiter ein Adressfeld vom Typ "collection" (Datensammlung) hat, gleicht die Ausgabe dem folgenden Beispiel: <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>

Zuordnung von Ergebnissen zu JSON

Die verschiedenen JSON-Ausgaben, die in den verschiedenen Szenarios generiert werden, sind im Folgenden erläutert.

Rückgabetyp ist "void"

Beim Rückgabetyp "void" ist die generierte JSON-Ausgabe ein JSON-Ergebnisobjekt.

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

Rückgabetyp ist ein primitives Element, ein Wrapper oder eine Zeichenfolge


Wenn die Methode in der Java-Bean public int getSalary() ist, gleicht die Ausgabe dem folgenden Beispiel: {"result":20000,"error":null,"id":1}
Wenn die Methode in der Java-Bean public String getMessage() ist, gleicht die Ausgabe dem folgenden Beispiel: {"result":"Hello World","error":null,"id":1}
Wenn die Methode in der Java-Bean public Boolean isLeapYear(int year) ist, gleicht die Ausgabe dem folgenden Beispiel: {"result":true,"error":null,"id":1}

Rückgabetyp ist eine Datensammlung

Wenn der Rückgabetyp eine Datensammlung ist, besteht die Ausgabe aus einer Reihe von Elementen, die jeweils einen Eintrag der Datensammlung repräsentieren. Enthält die Datensammlung Instanzen eines unterdrückten Objekttyps, wird dieser Eintrag ignoriert.


Wenn die Methode in der JavaBeans public Collection getEmployees() ist und die zurückgegebene Datensammlung Instanzen von Employee enthält, ähnelt die Ausgabe dem folgenden Beispiel: {"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

Rückgabetyp ist ein Array

Wenn der Rückgabetyp ein Array ist, besteht die Ausgabe aus einer Reihe von Elementen, die jeweils einen Eintrag im Array repräsentieren.


Wenn die Methode in der Java-Bean public Employee[] getEmployees() ist und der zurückgegebene Bereich aus Instanzen von "Employee" besteht, gleicht die Ausgabe dem folgenden Beispiel: {"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}

Rückgabetyp ist eine Zuordnung

Wenn der Rückgabetyp eine Zuordnung ist, besteht die Ausgabe aus einer Reihe von Schlüssel-Wert-Paaren.
Wenn die Methode in der Java-Bean public Map getDepartments() ist und die zurückgegebene Zuordnung ein Schlüssel-Wert-Paar mit Abteilungscode und Abteilungsdetails ist, gleicht die Ausgabe dem folgenden Beispiel:

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

Rückgabetyp ist JavaBeans

Die Java-Beans werden in Form von Schlüssel-Wert-Paaren dargestellt, wobei der Schlüssel der Name des Feldes und der Wert der Wert des Feldes ist. Es werden nur öffentliche Felder mit getter-Methoden serialisiert.
Wenn die Methode in der Java-Bean public Employee getEmployee() ist, gleicht die Ausgabe dem folgenden Beispiel:

{"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},"error":null,"id":1} Falls es für den Mitarbeiter (Employee) eine Managerreferenz gibt, gleicht die Ausgabe dem folgenden Beispiel: {"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1} Wenn der Mitarbeiter ein Adressfeld vom Typ "collection" (Datensammlung) hat, gleicht die Ausgabe dem folgenden Beispiel: {"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","adresses":["address1","address2","address3"]},"error":null,"id":1}

Instanzen wiederverwenden

Der RPC-Adapter kann erstens für die Erstellung einer neuen JavaBeans-Instanz pro Anforderung und zweitens für die Wiederverwendung von Instanzen für einen Benutzer konfiguriert werden. (Die letztgenannte Konfiguration wäre beispielsweise für das Objekt eines elektronischen Warenkorbs möglich.) Das Standardverhalten ist die Erstellung einer neuen JavaBeans-Instanz pro Anforderung. Die Wiederverwendung wird über die Bean-Deskriptorinformationen konfiguriert. Weitere Einzelheiten finden Sie in der Dokumentation zur Anwendungsprogrammierschnittstelle "SampleBeanInfo".

Bewährte Verfahren

Übergeordnete Logik

Bei der Entwicklung einiger Befehle wird nicht vermutet, dass sie direkt als Services zugänglich gemacht werden könnten. In solchen Fällen kann ein JavaBeans-Zugriffsmechanismus für die implizierte Logik entwickelt werden. Die ShoppingCart-EJB im Beispiel Plants By WebSphere enthält eine Methode addItem(StoreItem item). Das StoreItem-Objekt enthält den Artikelpreis. Bei der Gestaltung wurde somit davon ausgegangen, dass die Methode nur von vertrauenswürdigen Quellen wie der folgenden im Servlet ShoppingServlet aufgerufen werden würde:

// 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) { } Sie sehen, dass das ShoppingServlet Logik enthält, die praktisch eine virtuelle Methode wie addItem(String itemID, String qty) erstellt. Dieselbe Logik kann im JavaBeans-Zugriffsmechanismus wie folgt implementiert werden: 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-Schema:

Das folgnede Beispiel zeigt das XML-Schema für die Datei "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>

Nutzungsbedingungen | Feedback