Autor Thema: X-Page und Managed Bean  (Gelesen 4021 mal)

Offline vietzer

  • Frischling
  • *
  • Beiträge: 33
  • Geschlecht: Männlich
X-Page und Managed Bean
« 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?
« Letzte Änderung: 24.01.13 - 10:00:19 von vietzer »
Gruß, Steffen

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: X-Page und Managed Bean
« Antwort #1 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.

Offline vietzer

  • Frischling
  • *
  • Beiträge: 33
  • Geschlecht: Männlich
Re: X-Page und Managed Bean
« Antwort #2 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.
Gruß, Steffen

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: X-Page und Managed Bean
« Antwort #3 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.


Offline vietzer

  • Frischling
  • *
  • Beiträge: 33
  • Geschlecht: Männlich
Re: X-Page und Managed Bean
« Antwort #4 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 ;)
Gruß, Steffen

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz