@ViewScoped fordert @PostConstruct bei jedem postback-Anfrage
Scheint dies nicht Recht. Ich war dabei einige Aufräumarbeiten meinem code und ich habe gerade festgestellt das. Jeder ajax-request ist die Entlassung der Konstruktor und die @PostConstruct
meiner @ViewScoped
bean. Selbst eine einfache Datenbank Seitenumbruch ausgelöst.
Ich verstanden, dass @ViewScoped
ist mehr als @RequestScoped
und dass es nicht rekonstruiert werden, auf jede Anfrage. Erst nach einem kompletten Neuladen der Seite von GET.
InformationsquelleAutor Drew H | 2011-04-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In anderen Worten, Ihre
@ViewScoped
bean verhält sich wie ein@RequestScoped
bean. Es wurde von Grund auf neu erstellt bei jedem postback-Anfrage. Es gibt viele mögliche Ursachen für diese, von denen die meisten darauf hinauslaufen, dass die damit verbundenen JSF-view nicht mehr verfügbar ist in der JSF-Staat, der wiederum ist standardmäßig im Zusammenhang mit der HTTP-Sitzung.Vorausgesetzt, Sie können sicherstellen, dass der HTTP-Sitzung selbst ist nicht die Ursache des Problems ist, D. H. wenn
@SessionScoped
arbeitet absolut fein, dann gehen Sie durch die unten stehende Liste der möglichen Ursachen. Andernfalls, wenn die HTTP-Sitzung selbst ist auch im Arsch und neu auf jede einzelne Anfrage, dann müssen Sie einen Schritt zurück und betrachten Sie als session-cookie und server-Konfiguration. Jede Ursache auf eine fehlerhafte HTTP-Sitzung ist mindestens jenseits der Kontext von JSF.Bist du mit Mojarra 2.1.17 oder älter, und die Ansicht enthält EL-Ausdrücke, die binden, ein Blick scoped bean-Eigenschaft an ein tag-Attribut ausgewertet wird, während anzeigen erstellen. Beispiele sind JSTL
<c:if>
,<c:forEach>
usw oder JSF<ui:include>
,<x:someComponent id="#{...}"
,<x:someComponent binding="#{...}">
usw. Dies ist verursacht durch einen Fehler in Mojarra (Ausgabe 1492). Siehe auch Warum hat @PostConstruct-callback-Feuer jedes mal, obwohl bean @ViewScoped? JSFDies ist schon fest in Mojarra version 2.1.18 Vorhandensein. Wenn Sie nicht aktualisieren Sie auf eine neuere version, ist die Problemumgehung zu deaktivieren partiellen Status speichern, wie unten in
web.xml
finden Sie auch JSTL in Facelets-JSF2... macht das Sinn?Oder, wenn Sie wollen, um einen bestimmten Satz von JSF-views nur:
Wichtig zu erwähnen ist, dass die Bindung der Wert des JSF-Komponente
id
oderbinding
- Attribut auf einen Blick scoped bean-Eigenschaft ist eine schlechte Praxis. Diejenigen sollten sich wirklich an einen request scoped bean-Eigenschaft, oder eine alternative gesucht werden sollte. Siehe auch Wie funktioniert das 'binding' - Attribut arbeiten in JSF? Wann und wie sollten Sie eingesetzt werden?Bist du mit Mojarra 2.2.0, nur diese version hat einen (noch unbekannten) Fehler bei der Aufrechterhaltung der Ansicht, der Umfang ist schon fest in 2.2.1, siehe auch Problem 2912. Lösung aktualisieren Sie auf eine neuere version.
Den
@ViewScoped
annotation importiert aus dem falschen Paket. JSF bietet zwei@ViewScoped
Anmerkungen, einer ausjavax.faces.bean
- Paket für JSF managed beans kommentiert mit@ManagedBean
, und noch einer ausjavax.faces.view
- Paket für CDI managed beans kommentiert mit@Named
. Wenn die bean-scope annotation entspricht nicht den bean-management-annotation, die dann die eigentliche bean-scope werden die bean-management-framework die Standard-Rahmen, die@RequestScoped
im JSF managed beans und@Dependent
im CDI managed beans.Müssen Sie sicherstellen, dass Sie haben eine der folgenden Konstrukte und nicht mischen, siehe auch @ViewScoped bean neu erstellt bei jedem postback-request bei der Verwendung von JSF 2.2.
Ansicht ist (versehentlich?) markiert transient über
<f:view transient="true">
. Dieser dreht sich im Grunde auf "stateless JSF", die ist neu seit Mojarra 2.1.19. Hiermit die JSF-view einfach nicht gespeichert werden in der JSF-Zustand und die logische Konsequenz ist, dass alle referenzierten anzeigen scoped beans können nicht im Zusammenhang mit der JSF-view nicht mehr. Siehe auch Was ist der nutzen von Staatenlosigkeit in JSF?Die web-Anwendung so konfiguriert ist, mit
com.sun.faces.enableRestoreView11Compatibility
context-param-set zutrue
in einen falschen versuchen zu "vermeiden"ViewExpiredException
. Mit diesem context-param, dieViewExpiredException
wird nie geworfen, aber die Aussicht (und alle assoziierten view-scoped beans) wird gerade von Grund auf neu erstellt. Allerdings, wenn das passiert, bei jeder Anfrage, dann ist dieser Ansatz tatsächlich verbirgt sich ein weiteres problem: die Ansichten verfallen viel zu schnell. Diese zeigt ein mögliches problem in der Aufrechterhaltung der JSF-view-Mitgliedstaaten und/oder die HTTP-Sitzung. Wie zu lösen/zu konfigurieren, richtig, den Kopf zu javax.Gesichter.- Anwendung.ViewExpiredException: Ansicht konnte nicht wiederhergestellt werden.Web-Anwendung runtime classpath ist verschmutzt mit mehreren verschiedenen versionierten JSF-API und impl verwandten Klassen. Dies bewirkt, dass eine Beschädigung/mismatch in die Bezeichner,/Marker, die für die JSF-view state. Sie müssen sicherstellen, dass Sie nicht über mehrere JSF-API-JAR-Dateien in der webapp ist
/WEB-INF/lib
. Falls Sie mit Maven, stellen Sie gezielt sicher, dass Sie markieren Sie server-vorausgesetzt, die Bibliotheken als<scope>provided</scope>
. Siehe auch "Installation JSF" Abschnitt in unsere JSF-wiki-Seite und die Antwort auf diese Frage: Wie man richtig installieren und konfigurieren Sie die JSF-Bibliotheken über Maven?.Wenn Sie mit PrimeFaces
<p:dialog>
, dann stellen Sie sicher, dass die<p:dialog>
hat seine eigene<h:form>
und dass es nicht in einem anderen verschachtelten<h:form>
. Siehe auch p:fileUpload-innen p:dialog verlieren @ViewScoped Werte.Wenn Sie die Kombination von PrimeFaces
FileUploadFilter
mit PrettyFaces, dann stellen Sie sicher, dass dieFileUploadFilter
läuft auch auf PrettyFaces-umgeschrieben/weitergeleitet Anfragen. Siehe auch ViewScoped bean neu erstellt, wenn FileUploadListener nannte, mit PrettyFaces und Wie zu verwenden PrimeFaces p:fileUpload? Listener-Methode wird nie aufgerufen oder UploadedFile ist null, /wirft einen Fehler /nicht verwendbar.Wenn Sie mit PrettyFaces, eine schlecht konfigurierte rewrite-Regel leitet die CSS/JS/Bild Ressourcen, um eine JSF-Seite mit einer
@ViewScoped
bean wird auch irreführende Verhalten. Siehe auch CDI ViewScope & PrettyFaces: Mehrere Anrufe zu @PostConstruct (JSF 2.2).Leider Nein, deaktivieren partial-state-saving löst nicht das Problem mit den JSTL-tags. In diesem speziellen Fall ist jedoch schwierig. In der Theorie lösen können Sie dieses mit einem fullworthy Komponente, z.B.
<p:tabs>
akzeptiert eine Sammlung statt<ui:repeat><p:tab>
. Ich glaube, das war überhaupt veröffentlicht wird als feature request, PrimeFaces, nicht sicher, was Cagatay mit ihm Tat.PARTIAL_STATE_SAVING mein Leben verändert
Verwenden Sie einfach
rendered
- Attribut? Siehe auch stackoverflow.com/a/4870557 und stackoverflow.com/a/15947948. Alternativ einfach ein upgrade auf Mojarra 2.1.18 Vorhandensein oder neuer. Es ' s wurde behoben seit dann.Danke. Ich hatte dieses Problem bei der Verwendung von <c:if test="#{bean.Liste.size() > 0"}>... So habe ich es behoben, ersetzen <c:wenn> mit <h:panelGroup rendered="#{nicht leer bean.Liste}">
InformationsquelleAutor BalusC