JSF Lifecycle abbrechen?

WyattEarp

Mitglied
Hallo,

ich habe folgendes Problem mit JSF: in meinem JSF-Model ist ein Objekt hinterlegt, dessen Attribute auf meiner JSF-Seite bearbeitet werden können (durch Eingabefelder, etc.). An einer bestimmten Stelle lässt sich eine Validation-Exception provozieren, welche zu einem Abbruch des JSF-Lifecycles führt (mein PhaseLogger gibt an, dass direkt die RenderResponse-Phase aufgerufen wird nach der Validation-Phase). Wenn ich nach der Exception nur noch "immediate"-Buttons (in meinem Fall "Abbrechen") aufrufe und anschließend meine Methode zum Speichern des Objekts in der Datenbank, so sind manche Eigenschaften zurückgesetzt und das Objekt lässt sich nicht speichern. Die Werte waren jedoch im Model zu 100% gesetzt, stehen auch an der Oberfläche richtig und wurden mittels Log-Ausgaben auch richtig ausgegeben.

Auch seltsam ist, dass sich das Projekt wie gewünscht mit allen richtigen Werten speichern lässt, wenn ich nach der provozierten Exception die entsprechende Funktion noch einmal richtig (ohne Exception) durchführe. Hierbei gehen keine Attribute aus meinem Model verloren.

Weiß jemand einen Rat hierzu oder kann mir das Verhalten erläutern? Ich bin mit meinem Latein leider am Ende und kann es mir nur so erklären, dass scheinbar die Exception irgendein seltsames Verhalten auslöst, welches sich beim Speichern erst auswirkt.

Vielen Dank & viele Grüße,
WyattEarp
 
S

Sym

Gast
Ich verstehe das nicht.

Kannst Du vielleicht ein wenig Code von Deinem xhtml und Deinem Validator zeigen?
 

WyattEarp

Mitglied
Hallo Sym,

leider ist das schwierig, da es sich um ein Projekt handelt, dessen Code ich nicht herausgeben darf. Tut mir leid. Ich hoffe mir kann das Verhalten dennoch jemand erklären, weil ich mit meinem Latein hierbei absolut am Ende bin und es aus meiner Logik heraus eigentlich funktionieren müsste. Ich versuche mein Problem nochmal kurz zusammenzufassen:

Ablauf
1) Validations-Fehler, welcher regulär zum Abbruch des JSF-Lifecycles nach der Validierungs-Phase führt
2+3) 2x Button "Abbrechen" (immediate = true)
4) Button "Speichern", welcher mir ein in der zur Seite gehörenden BackingBean hinterlegtes Objekt mit verschiedenen Attributen in meine DB speichert. Die Attribute kann ich über Eingabefelder auf meiner JSF-Seite anpassen. In meinem Fall habe ich die Attribute jedoch so belassen, wie sie aus der DB beim Laden der Seite kamen (hier auch kein Fehler).

==> Speichern funktioniert nicht, weil ein NOT_NULL-Attribut plötzlich "null" ist, welches jedoch lt. Oberfläche noch fehlerfrei gesetzt ist. (Ein zweites Attribut ist auch zurückgesetzt, welches jedoch keinen DB-Fehler verursacht, weil es "null" sein darf)

Meine Vermutung liegt darin, dass es sich um ein Problem mit dem Abbruch des Lifecycles nach dem Validierungsfehler handelt. Sofern ich a) keinen Fehler bekomme oder b) nach einem Fehler (vorm Speichern) die Aktion erneut ohne Fehler ausführe, funktioniert alles fehlerfrei.

Vielen Dank für eure Hilfe ... :)
 
S

Sym

Gast
Ich verstehe nicht, warum Du zwischen dem Validierungsfehler und dem wiederholten Speichern 2 mal Abrechen drücken musst.

Generell ist es so, dass Werte die der Browser anzeigt nicht in der Bean sind, sondern noch im Komponentenbaum liegen. Und ein immediate überträgt auch keine Werte aus dem Browser in die Bean. Hat der Speichernbutton ebenfalls das Attribute immediate gesetzt?
 

WyattEarp

Mitglied
Ich muss 2x "Abbrechen" drücken, weil an dieser Stelle meiner Seite einen Workflow habe und der Fehler innerhalb dieses auftreten kann. Um den Workflow wieder zu verlassen (und so das "Speichern" aktivieren) muss ich 2 Schritte abbrechen (beide "Abbrechen"-Buttons sind "immediate"). Der "Speichern"-Button ist nicht "immediate".

Was ich eben nicht verstehe ist, warum Werte, die überhaupt nicht verändert worden sind plötzlich "null" sind und zwar NUR wenn der Validierungs-Fehler aufgetreten ist.
 
S

Sym

Gast
Bist Du in einer Conversation? Welchen Scope hat Deine Bean? Vielleicht ist die Seite nicht mehr aktuell und wurde neu initialisiert? Wurden die Daten, die im UI zu sehen sind, zuvor erfasst oder aus der Bean geladen?
 

AFlieger

Mitglied
Wie ist denn der Scope deiner ManagedBean.

Wenn du 2 mal Abbrechen klickst, sind das auch zwei Request-Response Zyklen.

Wenn nun der Scope deiner Bean Request ist, dann erklärt das wohl, warum nach dem 2. Klick die Werte wieder null sind
 

WyattEarp

Mitglied
Die Bean ist im "ViewScope", sollte also so lange erhalten bleiben wie ich mich auf der selben Seite befinde, was ich in meinem Fall auch tue. Um Conversations kümmere ich mich nicht. Initial werden die Werte der BackingBean mit den Daten meine DB-Objekts befüllt. Ich habe dann die Möglichkeit diese über die Oberfläche zu manipulieren.
 

WyattEarp

Mitglied
Hab die Bean mal in den SessionScope gelegt, aber genau das gleiche Phänomen. Ich kann mir wirklich nur vorstellen, dass irgendwas mit dem Abbrechen des Lifecycles schiefläuft, da es ohne Validierungs-Fehler absolut fehlerfrei läuft
 
S

Sym

Gast
Wie wird die Exception denn behandelt? Und wo findet die Behandlung statt? Ist das eine echte ValidationsException? Und in welcher JSF-Phase wird diese geworfen?
 

WyattEarp

Mitglied
1) Die Exception wird in der Validierungsphase des Lifecycles geworfen (lt. Phaselogger).
2) Die Behandlung erfolgt im Projekt folgendermaßen: wir haben eine Validierungsmethode, welche das gesamte <form> validiert. Innerhalb dieser Methode werden für einzelne Fälle (abhängig davon, welcher Button gedrückt wurde) weitere Validierungs-Methoden aufgerufen. Für ungültige Werte wird hierbei eine eine (projekteigenen) Exception geworfen. Diese wird in der <form>-Validierung gefangen und eine entsprechende Fehlernachricht in eine Liste eingehängt. Ist nach Abschluss der Validierung (erkannt wird dies durch einen PhaseListener) mind. 1 Eintrag in dieser Liste, wird FacesContext.renderResponse() aufgerufen und der Lifecycle so unterbrochen.
 
S

Sym

Gast
Irgendwie verstehe ich die Validierung der Form nicht. Geschieht dies ebenfalls über einen PhaseListener? Oder ist das eine gebundene Action?
 

WyattEarp

Mitglied
An den einzelnen Komponenten hängen normale Validator-Methoden. Für eine erweiterte Validierung der gesamten <form> (z.B. Cross-Field-Validation) gibt es mittels eines PhaseListeners noch eine extra Validierungsmethode. In dieser werden dann, abhängig vom gedrückten Button, ggf. zusätzliche Validierungen ausgeführt. Hier liegt auch der Ursprung meiner Exception ...
 

WyattEarp

Mitglied
Schade, aber ich kann wirklich keinen Code posten. Und ich glaube es würde nicht viel bringen, wenn ich den Code irgendwie umschreibe, sodass er keine relevanten Informationen mehr enthält. Danke dir dennoch für die ganze Hilfe, Sym :)

Hat vielleicht jemand gute Links, wo JSF auf einer detaillierteren Ebene erklärt wird? Die meisten Seiten behandeln das Framework ja ziemlich oberflächlich und geizen mit tiefgehenden Informationen zur Funktionsweise. Speziell interessant wären tiefer gehende Informationen zum JSF-Lifecycle.
 

Ähnliche Java Themen

Neue Themen


Oben