Domino 9 und frühere Versionen > ND8: Entwicklung - XPages

X-Page und Managed Bean

(1/1)

vietzer:
Hallo,

ich versuche in einer XPage eine Datenquelle mit einer Managed-Bean zu verbinden.
Die Quelle ist wie folgt angelegt:

--- Code: ---<xp:this.data>
 <xp:dominoDocument var="docDownload" formName="faDownload"
  action="openDocument">
 </xp:dominoDocument>
</xp:this.data>
--- Ende Code ---

In der faces-config.xml gibt es folgenden Eintrag:

--- Code: ---<managed-bean>
 <managed-bean-name>downloadController</managed-bean-name>
  <managed-bean-class>com.example.DownloadController</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
   <managed-property>
     <property-name>download</property-name>
      <property-class>com.ibm.xsp.model.domino.wrapped.DominoDocument</property-class>
      <value>#{docDownload}</value>
    </managed-property>
</managed-bean>
--- Ende Code ---

Die Klasse DownloadController sieht wie folgt aus:


--- Code: ---public class DownloadController implements Serializable {

    private static final long serialVersionUID = 8450916369314828059L;
    private DominoDocument docDownload;

    public DownloadController() {

    }

    public void doSomething() {

    }

    public void setDownload(DominoDocument download) {
this.docDownload = download;
    }

    public DominoDocument getDownload() {
return docDownload;
    }

}
--- Ende Code ---

In der XPage gibt es eine Schaltfläche die eine Funktion aus der Bean ausführen soll.
Definiere ich diese über die EL funktioniert alles wie gewünscht:


--- Code: ---<xp:button value="Label" id="button1">
 <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
  <xp:this.action>
   <xp:executeScript
    script="#{downloadController.doSomething}">
   </xp:executeScript>
  </xp:this.action>
 </xp:eventHandler>
</xp:button>
--- Ende Code ---

Wenn ich das aber über Java-Script machen möchte erhalte ich eine Fehlermeldung:


--- Code: ---<xp:button value="Label" id="button1">
 <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
  <xp:this.action>
   <xp:executeScript
    script="#{javascript:downloadController.doSomething()}">
   </xp:executeScript>
  </xp:this.action>
 </xp:eventHandler>
</xp:button>
--- Ende Code ---

Fehler beim Ausführen eines JavaScript-Aktionsausdrucks.
javax.faces.FacesException: Managed Bean-Eigenschaft kann nicht festgelegt werden: „download“.
Managed Bean-Eigenschaft kann nicht festgelegt werden: „download“.
Access denied (java.lang.RuntimePermission getClassLoader)

Ausdruck

   1: #{javascript:downloadController.doSomething}


Woher kommt der Fehler und was kann ich tun damit er nicht auftritt?

Sven Hasselbach:
SSJS Code kann in der von der IBM ausgelieferten Default Java Policy keine Eigenschaften einer Managed Bean setzen.
Daher musst Du nur die java.policy anpassen, und dem Code mehr Rechte einräumen:


--- Code: ---grant codeBase "xspnsf://server:0/-" {
permission java.lang.RuntimePermission "getClassLoader";
};

--- Ende Code ---

Das erlaubt der XPage Engine, zur Laufzeit Klassen nachzuladen, dann läuft der SSJS Code auch.
Alternativ kann auch noch der Pfad zur DB in den Grant mitaufgenommen werden, dann kann das nur die betroffene DB.

Ggf. ist es erforderlich, den Server durchzustarten.

vietzer:
Ah ok, danke.

Sowas in der Art hatte ich mir schon gedacht aber nicht gewusst dass es da einen Unterschied zwischen SSJS und EL gibt.

Sven Hasselbach:
Es gibt da noch einen Workaround, ohne die Policy ändern zu müssen: Wird die MB erst mit EL initialisiert, kann man per SSJS auf sie zugreifen.
Dazu kann man eine Dummy Methode in die MB einbauen, die nur für die Initialisierung gedacht ist:


--- Code: ---   ...
   ...
    public void dummy(){
    // Macht gar nix
    }
    ...
    ...

--- Ende Code ---

Dann den EL-Aufruf vor den SSJS Code setzen:

--- Code: ---   <xp:executeScript script="#{downloadController.dummy}#{javascript:downloadController.doSomething()}" />

--- Ende Code ---

Beim Aufruf des MethodBindings wird der EL Ausdruck vor dem SSJS ausgewertet, und die MB steht zur Laufzeit zur Verfügung.

vietzer:
Sowas ähnliches hatte ich zunächst auch versucht. Den Aufruf der Dummy-Methode hattte ich allerdings im postOpenDocument der Datenquelle.
Beim Aufruf des Scripts erfolgte dann aber immernoch der Fehler.

Dass man EL und SSJS in einem Script so verketten kann wusste ich bis eben auch nicht.

Also nochmals vielen Dank, hab wieder einiges gelernt ;)

Navigation

[0] Themen-Index

Zur normalen Ansicht wechseln