In meinem letzten Beitrag habe ich einen Bug entdeckt, den ich an dieser Stelle noch etwas ausführlicher darstellen möchte, denn es handelt sich hierbei nicht um ein normales Verhalten von JSF, sondern schlichtweg um einen Bug während der Transformation nach Java.
Im Vorfeld möchte ich jedoch auf einen sehr guten Artikel von Paul Withers aufmerksam machen, in dem ausführlich dargestellt wird, wie es sein müsste:
http://www.intec.co.uk/xpages-bindings-when-runs-at-page-load/
Der Einfachheit halber greife ich das von Paul gegebene Beispiel auf, um den Bug zu verdeutlichen. Ergänzt man nämlich den Code um Anführungszeichen, dann wird der „On Page Load„-Code nicht mehr ausgeführt:
<xp:text id="computedField2" escape="true" value="You are logged in as '${javascript:@UserName()}'. The fields id is #{id:computedField1}"></xp:text>
[Fett: Der „On Page Load“-Code // In Rot: Die zusätzlichen Anführungszeichen]
Das Ergebnis ist dann folgendes:
Zurückzuführen ist das auf einen Fehler bei der Transformierung, der generierte Javacode sieht wie folgt aus:
Dies ist ein Bug im Designer, denn jedwede Form der ${}-Syntax wird ungeprüft als „On Page Load“ interpretiert. So wird der folgende Code trotz Fehler in EL übersetzt…
… hingegen wird diese Variante ordnungsgemäß als Fehler markiert und lässt sich nicht speichern:
Irrtümlicherweise habe ich in meinem vorigen Artikel weitere Beispiele aufgeführt, die Code enthalten, der ohne das Anführungszeichen ausgeführt wird. Dies war im Zuge des Schreiben des letzten Artikels, als ich noch weitere Test gemacht habe. Hier ist das Verhalten natürlich JSF-konform und der Code wird ordnungsgemäß ausgeführt.
Meine Beobachtung bezüglich der fehlerhaften Transformation jedoch bezieht sich nicht nur auf Output Scripts, sondern um jede Art des Value Bindings: Sobald eine x-beliebige Kombination von ${} (auch über mehrere Zeilen etc.) vorkommt, tritt der Fehler auf.
Pingback: Bug: ${} in Output Script-Blöcken | blog@hasselba.ch
Pingback: “Compute Dynamically” Vs. “Compute on Page Load” | blog@hasselba.ch