Hallo,
ich versuche in einer XPage eine Datenquelle mit einer Managed-Bean zu verbinden.
Die Quelle ist wie folgt angelegt:
<xp:this.data>
<xp:dominoDocument var="docDownload" formName="faDownload"
action="openDocument">
</xp:dominoDocument>
</xp:this.data>
In der faces-config.xml gibt es folgenden Eintrag:
<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>
Die Klasse DownloadController sieht wie folgt aus:
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;
}
}
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:
<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>
Wenn ich das aber über Java-Script machen möchte erhalte ich eine Fehlermeldung:
<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>
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?
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:
grant codeBase "xspnsf://server:0/-" {
permission java.lang.RuntimePermission "getClassLoader";
};
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.
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:
...
...
public void dummy(){
// Macht gar nix
}
...
...
Dann den EL-Aufruf vor den SSJS Code setzen:
<xp:executeScript script="#{downloadController.dummy}#{javascript:downloadController.doSomething()}" />
Beim Aufruf des MethodBindings wird der EL Ausdruck vor dem SSJS ausgewertet, und die MB steht zur Laufzeit zur Verfügung.