Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung - XPages => Thema gestartet von: vietzer am 23.01.13 - 16:47:01

Titel: X-Page und Managed Bean
Beitrag von: vietzer am 23.01.13 - 16:47:01
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>

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> 

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;
    }

}

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>

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>

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?
Titel: Re: X-Page und Managed Bean
Beitrag von: Sven Hasselbach am 24.01.13 - 09:11:27
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"; 
};

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.
Titel: Re: X-Page und Managed Bean
Beitrag von: vietzer am 24.01.13 - 09:59:48
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.
Titel: Re: X-Page und Managed Bean
Beitrag von: Sven Hasselbach am 24.01.13 - 10:27:53
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
    }
    ...
    ...

Dann den EL-Aufruf vor den SSJS Code setzen:
Code
   <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.

Titel: Re: X-Page und Managed Bean
Beitrag von: vietzer am 24.01.13 - 12:01:29
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 ;)