Abfangen einer fehlerhaften „documentId“

Öffnet man eine XPage, die ein Dokument über eine Datasource einbindet, kann man die UNID des Dokumentes über den „documentId“-Parameter angeben.

Problematisch ist allerdings, wenn die UNID falsch ist (z.B. wenn das Dokument gelöscht wurde), denn dies führt zu hässlichen 500er-Fehlern auf der XPage bzw. zu dem Fehler „Could not open the document“:

Um dieses Problem in den Griff zu bekommen, muß die Datasource so modifiziert werden, daß der Parameter „documentId“ nicht mehr als Vorgabewert verwendet wird, gleiches gilt für den Parameter „action“.

Dazu wird in der Datasource die Option „ignoreRequestParams“ auf „true“ gesetzt. Nun müssen nur noch die beiden Angaben manuell berechnet werden:

<xp:dominoDocument var="document1" ignoreRequestParams="true">
<xp:this.documentId>
<![CDATA[#{javascript:var unid = getHTTPQueryParam( "documentId" );
var isOK = false;
try{
   doc = database.getDocumentByUNID( unid );
   if( doc !=null )
      isOK = true;
}catch(e){}
if( isOK ){
    return unid;
}
return "";
}]]></xp:this.documentId> <xp:this.action>
<![CDATA[#{javascript:var unid = getHTTPQueryParam( "documentId" );
   var isOK = false;
   try{
      doc = database.getDocumentByUNID( unid );
      if( doc !=null )
         isOK = true;
   }catch(e){}

   if( isOK ){ return "editDocument"; }
      else{ return "newDocument" };

}]]>
</xp:this.action>
</xp:dominoDocument>

[In Fett: Die beiden berechneten Parameter „documentId“ und „action“ & der „Ignore“-Parameter // In Rot: Die jeweilige berechnete Aktion]

Durch den Code wird erreicht, daß das angegebene Dokument im Edit-Mode geöffnet wird; ist dies nicht möglich, wird ein neues Dokument erstellt. Die Fehlermeldung bei Öffnen wird hierdurch verhindert und die XPage kann weiter verarbeitet werden. Für ein erweitertes Errorhandling (um z.B. eine Fehlermeldung auszugeben) könnte eine Variable im ViewScope gesetzt werden, die auf der XPage ausgewertet werden kann.

Hier noch die Funktion zum Auslesen der HTTP-Queryparameter:

function getHTTPQueryParam( pParam ){
   q = facesContext.getExternalContext()
      .getRequest().getQueryString();
   if (q.indexOf(pParam+"=")>-1) {
      v = q.substring(q.indexOf(pParam+"=")+pParam.length()+1,
         q.length());
      v = (v.indexOf("&")>-1?v.substring(0,v.indexOf("&")):v);
      if ((typeof v !== "undefined") && !v.equalsIgnoreCase("")) {
         return (v);
      } else {
         return false;
      }
    }
}

[Funktion liefert Wert des abgefragten URL-Parameters zurück, oder false]

Dieser Beitrag wurde unter Allgemein, Errorhandling, Java Script, ServerSide JavaScript, Web, XPages abgelegt und mit , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.