Rich Internet Applications mit ExtJS und Jersey
Kommentare

Rücksturz zur Wirklichkeit
Ein erstes Beispiel für unerwartete Client-Server-Probleme sind Listen bzw. Arrays von Objekten. Normalerweise sollte das Format des vom Server gelieferten Resultats unabhängig

Rücksturz zur Wirklichkeit

Ein erstes Beispiel für unerwartete Client-Server-Probleme sind Listen bzw. Arrays von Objekten. Normalerweise sollte das Format des vom Server gelieferten Resultats unabhängig von der Anzahl der Objekte immer eine JSON-Liste sein. Aufgrund eines Fehlers im Java XML Databinding (JAXB), das serverseitig implizit verwendet wird, gibt Jersey statt einer Liste mit einem Element nur das einfache Objekt zurück, es fehlen also die erste und die letzte Zeile:

{"versicherter": [
    {"fallnr": "00060", "gdatum": "01.01.1900", "beginn": "2007-12-01" }
]}

Leider erwartet ExtJS immer ein JSON Array vom Server, selbst dann, wenn nur ein Datensatz vorhanden ist. Eine mögliche Lösung ist eine Änderung in der Methode onRead des HttpProxy. Dort kann man dynamisch die Array Begrenzungen in das JSON einfügen. Allerdings ist Vorsicht geboten, denn das funktioniert nur für das Objekt auf der obersten Ebene, und nicht, wenn dieses wiederum Array-Attribute enthält.

Babylon A.D.

Eine weitere Herausforderung sind die unterschiedlichen Dialekte von JSON. Während ExtJS

{"type":"A310",":{"type":"A310", "length":19, "capacity":1901, "producer":"1"}}

liefert, erwartet Jersey denselben Inhalt ohne vorangestelltes Schlüsselattribut (in diesem Fall type):

{"type":"A310", "length":"49", "capacity":"1901", "producer":"1"}

An dieser Stelle nutzen wir die dynamische Natur von JavaScript, um das Übertragungsformat direkt zu manipulieren. Die Lösung besteht aus drei Schritten. Zunächst implementiert man die Funktion recordToJSON, die das für den Server korrekte JSON generiert (Listing 5). Im zweiten Schritt muss dann diese Funktion direkt vor dem „Write“ Request des Proxies aufgerufen werden. Dazu ist ein Event Handler für „beforeWrite“ nötig. Drittens ist dann noch eine Änderung in der Methode doRequest des Proxies notwendig, um das so generierte JSON auch verwenden zu können. Es genügt, mithilfe der Vererbungstechnik von ExtJS (override) eine Zeile zu ändern, damit ExtJS dann das für Jersey notwendige JSON erzeugt.

Listing 5
function recordToJSON( record ) {
  var result = '{';  
  for (var i = 0; i 1) { result = result + ','; }
      result = result + '"' + name +'":"'+value+'"';    
  }
  return result+'}';
}

myproxy.on( 'beforewrite', function ( DataProxy, action, rs, params ) {
params.jsonData = recordToJSON(rs);
});

Ext.override( Ext.data.HttpProxy, { doRequest : function(action, rs, params) {
[.]
o.jsonData = params.jsonData;  // replaces o.jsonData = params;
[.]
}

Auf der letzten Seite erwarten Euch folgenden Themen:

  • http 204 antwortet nicht
  • Das unentdeckte Land
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -