2010-12-30 9 views
4

Ich verwende JSF 2.0 und EJB 3.1 in der Glassfish v3 App Server. Und ich habe tatsächlich das folgende Problem:
In einem MenagedBean mit RequestScope möchte ich auf ein Sitzungsobjekt (ein EJB mit @Stateful) zugreifen, das einige sitzungsrelevante Informationen als die ausgewählte Kategorie, die ausgewählte Seite (mit einer Datentabelle Paginator für jede Kategorie), etc. - nichts besonderes, denke ich.
Wenn zum ersten Mal eine Kategorie ausgewählt wird, wird die Datentabelle erstellt und angezeigt. Okay, soweit. Wenn nun auf ein Element (Zeile) geklickt wird (um die Details des Elements anzuzeigen) oder wenn die nächste Seite angezeigt werden soll, wird die Sitzung (das stateful EJB) erneut erstellt und die Standardwerte werden wieder zum Anzeigen und Rendern der Seite verwendet.Problem mit Stateful EJB in ManagedBean mit RequestScope

Der Code sieht so aus:

@ManagedBean 
@RequestScoped 
public class TableViewBean { 

    @EJB 
    SessionBean session; 

    public DataModel getTable() { 
      return session.getDataModel(); 
     } 

     public SessionBean getSession(){ 
      return session; 
     } 
     public void next() { 
      session.getPaginator().nextPage(); 
      session.resetList(); 
     } 

     public void previous() { 
       session.getPaginator().previousPage(); 
       session.resetList(); 
     } 
     // some other code 
    } 

und der Session EJB:

@Stateful 
public class SessionBean { 

private String selectedType = "Entity"; 

private DataModel dataModel; 
private int rowsPerPage = 5; 
private Paginator paginator; 


public void setSelectedType(String type){ 
    if(!type.equalsIgnoreCase(selectedType)){ 
     selectedType = type; 

     updateService(); 
    } 
    resetList(); 
} 


public void resetList() { 
    dataModel = null; 
} 

public void resetPagination() { 
    paginator = null; 
} 

public int getRowsPerPage() { 
    return rowsPerPage; 
} 

public void setRowsPerPage(int rowsPerPage) { 
    this.rowsPerPage = rowsPerPage; 
    resetList(); 
    resetPagination(); 
} 

public Paginator getPaginator() { 
    if (paginator == null) { 
     paginator = new Paginator(rowsPerPage) { 

      @Override 
      public int getItemsCount() { 
       return selectedService.getCount(); 
      } 

      @Override 
      public DataModel createPageDataModel() { 
       DataModel model = null; 
       if(selectedService != null){ 
        model = new ListDataModel(....); 
       } 
       return model; 
      } 
     }; 
    } 

    return paginator; 

} 

public DataModel getDataModel() { 
    if(dataModel == null){ 
     dataModel = getPaginator().createPageDataModel(); 
    } 

    return dataModel; 
} 

}

Wenn ich den Umfang der ManagedBean ändern funktioniert alles einwandfrei SessionScope, aber ich don tu dies wegen der Verwendung von Speicherproblemen.

Was ist los mit meinem Code ... bitte hilf mir.

Greetz, Gerry

Antwort

5

Ihr RequestScoped ManagedBean wird für jede Anfrage neu instanziiert (das ist, was Mittel, nachdem alle RequestScoped). Daher wird bei jeder Instanziierung eine neue SFSB-Instanz injiziert.

+0

Okay, aber wie kann ich meine Anforderung verwalten, ein requestScope Managedbean als Backingbean zu verwenden und ein sitzungslanges EJB zu haben, das alle sessionbezogenen Daten enthält und in verschiedenen Backing-Beans verwendet werden kann? – gerry

+0

Warum ist der Request Scope Managed Bean eine Anforderung? Aufgrund von Speicherproblemen? Ihre verwaltete Bean enthält jedoch nur einen Verweis auf eine Stateful-Bean (was erforderlich ist, wenn Sie diese Bean als Stateful verwenden möchten). Ihre Speicherprobleme, falls vorhanden, könnten sich auf die Stateful Bean selbst beziehen, nicht auf die wirklich leichte Managed Bean. –

+0

Wenn dies jedoch eine Voraussetzung ist, können Sie das gewünschte Verhalten erzielen. aber Sie müssen das SFSB irgendwie in Ihrer HttpSession speichern und dann in der getTable() - Methode Ihrer verwalteten Bean nachsehen, anstatt es als Instanzfeld zu injizieren. –