Announcement

Collapse
No announcement yet.

JSF Initialisierung von Managed-Beans

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JSF Initialisierung von Managed-Beans

    Hallo zusammen

    Bei der Umstellung einer bestehenden Anwendung auf JSF, bin ich auf folgendes Problem gestoßen.

    In einer Managed Bean mit dem Namen GameListBean wird eine Liste von GameBean Objekten verwaltet. Diese stellen wiederum Managed Beans dar und sollen in einer DataTable angezeigt werden.

    Die Initialisierung der GameBean - Liste findet während der Initialisierung der GameListBean statt. Die einzelnen GameBean Objekte werden dabei durch einen expliziten Aufruf des default - Konstruktors erzeugt.

    Laut Debug - Informationen wird die Liste auch korrekt initialisiert und mit GameBean Objekten befüllt. Wenn ich die JSF-Seite für die Anzeige der Tabelle mit den Spielen aufrufen, wird die get-Methode für die GameBean - Liste aufgerufen. Auch eine Überprüfung der Liste auf den Wert 'null' oder eine leere Liste in einem "rendered" Ausdruck funktioniert. Die in der Liste enthaltenen GameBean - Objekte werden jedoch weder in einer DataTable, noch in einem SelectOneMenu angezeigt werden. Die entsprechenden UI Komponenten werden dann überhaupt nicht erzeugt, ohne dass es im Server-Log einen Hinweis auf die Ursache des Fehlers gibt.

    Könnte dies daran liegen, das die GameBean's aufgrund des expliziten Konstruktoraufrufs zwar erzeugt, jedoch nicht im JSF Kontext registriert werden?

    Hat jemand eine Idee, wie ich die Beans trotzdem verwenden kann. Alternativ müssten die Beans automatisch durch den JSF Container erzeugt und mindestens mit einer gültigen Spiel-ID initialisiert werden können. Wie dies möglich ist, ohne zusätzliche DI Frameworks, wie etwa Spring zu bemühen, dazu habe ich momentan jedoch keine Idee. Leider konnte ichb hierzu im Web auch kaum Informationen finden.

    Hier noch etwas Code:

    Auszug aus GamesMB

    Code:
    private GameMB[] gamesNotToRegisterFor;
    	private GameMB[] gamesToRegisterFor;
    	
    	private HtmlDataTable gamesDataTable;
    	private GameMB gameItem;
    	
    	Logger logger = Logger.getLogger(GamesMB.class);
    	
    	
    	public GamesMB(){
    		fetchGamesList();
    	}
    
    	public GameMB[] getGamesNotToRegisterFor() {
    		if (logger.isDebugEnabled())
        		logger.debug("entered List<GameMB> getGamesNotToRegisterFor()");
    		if (gamesNotToRegisterFor == null || gamesNotToRegisterFor.length == 0)
    			logger.error("Games Vector retrieved form session-bean is null.");
    		
    		return gamesNotToRegisterFor;
    	}
    	
    	public GameMB[] getGamesToRegisterFor() {
    		if (logger.isDebugEnabled())
        		logger.debug("entered List<GameMB> getGamesToRegisterFor()");
    		if (gamesToRegisterFor == null || gamesToRegisterFor.length == 0)
    			logger.debug("Games Vector retrieved form session-bean is null or empty.");
    		
    		return gamesToRegisterFor;
    	}
    
    	
    	public void setGamesNotToRegisterFor(Vector<GameMB> tempGames) {
    		if (tempGames == null)
    			logger.error("Games Vector retrieved form session-bean is null.");
    		
    		gamesNotToRegisterFor = new GameMB[tempGames.size()];
    		gamesNotToRegisterFor = (GameMB[])tempGames.toArray();		
    	}
    	
    	public void setGamesToRegisterFor(Vector<GameMB> tempGames) {
    		if (tempGames == null)
    			logger.error("Games Vector retrieved form session-bean is null.");
    		
    		gamesToRegisterFor = new GameMB[tempGames.size()];
    		gamesToRegisterFor = (GameMB[])tempGames.toArray();
    	}
    Auszug aus GameMB:

    Code:
    private static final long serialVersionUID = 2934723410254681213L;
    	
    	private String name;
    	private String realNamePK;
    	private String description;
    	private String news;
    	private int state;
    	private int round;
    	private int roundCount;
    	private String ending;
    	private ExternalLinkMB[] externalLinks;
    	private String adminContact;
    	private ExternalLinkMB mainLink;
    	private String instructionsAfterRegistration;
    	
    	private boolean playersCanLogIn;
    	private boolean playersCanRegister;
    	
    	
    	public void setRoundCount(int roundCount) {
    		this.roundCount = roundCount;
    	}
    	
    	public int getRoundCount() {
    		return roundCount;
    	}
    faces-config.xml:

    Code:
    <managed-bean>
      <managed-bean-name>gameBean</managed-bean-name>
      <managed-bean-class>control.managedBeans.GameMB</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
     </managed-bean>
     <managed-bean>
      <managed-bean-name>gamesBean</managed-bean-name>
      <managed-bean-class>control.managedBeans.GamesMB</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
     </managed-bean>
    DataTable Definition:

    Code:
    <h:form id="selectGameToRegisterForm" styleClass="formcontainer" rendered="#{!empty gamesBean.gamesToRegisterFor}">
    				<h:dataTable id="selectGameToRegisterTable" value="#{gamesBean.gamesToRegisterFor}" 
    						var="gameItem" binding="#{gamesBean.gamesDataTable}" 
    						border="0" cellpadding="0" cellspacing="0" rowClasses="tableelement1, tableelement2">
    					      		
    					<h:column>
    					      <f:facet name="header">
    					      	<h:outputText value="#{res['base.game']}" styleClass="tableheader"/>
    					    </f:facet>     		
    					    <h:commandLink action="#{gamesBean.executeGameSelection}" value="#{gameItem.name}" styleClass="tablelink"/>
    					</h:column>
    					      		
    					<h:column>
    					    <f:facet name="header">
    					      	<h:outputText value="#{res['welcome.game.description']}" styleClass="tableheader"/>
    					    </f:facet> 
    					    <h:outputText value="#{gameItem.descriptionShort}" />
    					</h:column>
    					      		
    					<h:column>
    					   	<f:facet name="header">
    					      	<h:outputText value="#{res['game.base.turn']}" styleClass="tableheader"/>
    					    </f:facet> 
    					    <h:outputText value="#{gameItem.round}" />
    					</h:column>
    					      		
    					<h:column>
    					    <f:facet name="header">
    					      	<h:outputText value="#{res['welcome.game.closingDateOfRound']}" styleClass="tableheader"/>
    					    </f:facet> 
    					    <h:outputText value="#{gameItem.ending}" />
    					</h:column>
    					      		
    					<h:column>
    					    <f:facet name="header">
    					      	<h:outputText value="#{res['welcome.game.mainLink']}" styleClass="tableheader"/>
    					    </f:facet> 
    					    <h:outputLink value="#{gameItem.mainLink}">
    					      	<h:outputText value="#{gameItem.mainLink}" styleClass="tablelink"/>
    					    </h:outputLink>			      		
    					</h:column>
    					      		
    				</h:dataTable> 
    			</h:form>
    Ich bin für jeden Hinweis und jede Hilfe dankbar.

  • #2
    Hab leider grad nicht die Zeit, alles nachzuverfolgen, aber dataTables werden auf folgender Seite ganz gut beschrieben:
    http://balusc.blogspot.com/2006/06/u...atatables.html

    Ansonsten, welche JSF Version benutzt du? Hatte einige Probleme mit der 1.2.0 bei dataTables...

    Hoffe das hilft ein wenig.

    Comment


    • #3
      Danke für Deine Antwort

      Ich benutze die Version 1.2 in Verbindung mit Facelets. Allerdings scheint es kein DataTable spezifisches Problem zu sein. Ein SelectOneMenu, welches die GameBean - Liste als Input bekommt, wird ebenfalls nicht dargestellt. Alle anderen Properties der GamesListBean werden hingegen korrekt angezeigt. Für die Liste wird lediglich die get - Methode aufgerufen. Ein Aufruf der get -Methoden der Listenelemente erfolgt nicht mehr.

      Comment


      • #4
        Nach drei Tagen nerviger Fehlersuche ist es nun vollbracht.

        Die Ursache des Problems war ein falsch konfiguriertes Binding der DataTable an ein Property der GamesBean. Anstatt eine Exception zu werfen, hat JSF intern das HtmlDataTable Objekt zwar erzeugt, die DataTable jedoch nicht gerendert. Dieses zweifelhafte Art des Fehlerhandling hat mich dann drei Tage gekostet.

        Comment

        Working...
        X