JSTL c: forEach bewirkt, dass @ViewScoped-Bean bei jeder Anforderung @PostConstruct aufruft

8

Wieder sehe ich, dass @PostConstruct jedes Mal feuert, obwohl kein bindendes Attribut verwendet wird. Siehe diesen Code: -

%Vor%

Und das ist die einfachste mögliche Bean in JSF: -

%Vor%

Sehen Sie jedes Verhalten, das dazu führen sollte, dass der Post-Construct-Callback jedes Mal ausgelöst wird? Ich denke JSF 2.0 ist sehr instabil. Wenn PostConstruct jedes Mal ausgelöst werden soll, welchen Zweck erfüllt @ViewScoped? Warum nicht nur @RequestScoped verwenden? Ich dachte, ich hätte einen Fehler in meiner Bewerbung gemacht. Aber als ich das so einfach wie möglich in JSF erstellt habe, bekomme ich immer noch diesen Fehler. Versteh ich die Bereiche von JSF nicht? oder testen sie es nicht richtig? Weiter, wenn Sie c: forEach entfernen und ersetzen Sie es mit UI: wiederholen, dann funktioniert es gut.

Warten auf Antworten, um zu bestätigen, ob es sich um einen Fehler handelt oder es beabsichtigt ist, die Programmierer davon abzuhalten, jstl zu benutzen?

    
TCM 16.05.2010, 02:23
quelle

1 Antwort

13

Dieses Problem hat die gleichen Gründe wie Ihre vorherige Frage, die hier beantwortet wird: Warum wird @PostConstruct-Callback jedes Mal ausgelöst, obwohl Bean @ViewScoped ist? JSF .

Das ist in der Tat ein Bug in JSF2. Es ist eine Hühnereifrage. Die View-Scoped-Beans werden im JSF-Ansichtszustand gespeichert. Daher sind die View-Scoped-Beans nur nach der Restore-Ansichtsphase verfügbar. JSTL-Tags werden jedoch während der Restore-Ansichtsphase ausgeführt, während die für die Ansicht gültigen Beans noch nicht verfügbar sind. Dies verursacht die Erstellung einer brandneuen View-Scoped-Bean-Instanz, die später durch die echte View-Scoped-Bean ersetzt wird, die im wiederhergestellten JSF-Ansichtszustand gespeichert wurde.

Dies wird als JSF-Problem 1665 und JSF-Spezifikation isssue 787 , die für JSF 2.2 korrigiert und in Mojarra 2.1.18 zurückportiert wurde. Also sollte man nur auf ein Minimum von Mojarra 2.1.18 upgraden.

Wenn Sie kein Upgrade durchführen können, verwenden Sie am besten JSTL-Tags auf Anfrage / Sitzung / Anwendung mit beschränkten Beans oder suchen Sie nach alternativen Möglichkeiten für die jeweilige funktionale Anforderung. Sie können <c:forEach> durch <ui:repeat> ersetzen, wie Sie bereits herausgefunden haben.

Siehe auch:

BalusC 16.05.2010, 02:39
quelle

Tags und Links