# Exceptions & Messaging in JSF 2.0



## JSF-Neuling (29. Jul 2010)

Wenn ich das alles richtig verstanden habe, können Exceptions und Messages in Bezug zu bestimmten JSF-UI-Komponenten dargestellt werden, allerdings nur, wenn diese bei der Konvertierung oder Validierung auftreten!? Was ist aber nun, wenn Exceptions von Methoden des Modells geworfen werden?

Vielleicht ist folgendes Beispiel hilfreich, um meine Frage besser zu verstehen:
Angenommen das Modell bietet eine Funktion bspw. führeBuchungAus(). Bei der Konvertierung kann ich nun prüfen, ob die Eingaben des Ende- und Anfangdatums dem Datumsformat entsprechen und dementsprechend bei dem Feld, wo Probleme aufgetreten sind, eine Fehlermeldung ausgeben. In der Validierung kann nun geprüft werden, ob bspw. das Ende-Datum nun auch nach dem Anfangsdatum ist, oder das Anfangsdatum nicht in der Vergangenheit liegt, oder so etwas in der Art und ebenfalls wieder dem Eingabefeld-entsprechen eine Fehlermeldung auszuführen. Wenn der Benutzer aber nun alles korrekt eingegeben hat und die Buchung abschickt, könnte ja bspw. ein Fehler im Modell auftreten, wenn beispielsweise das ausgewählte Hotel zum Zeitpunkt des Abschickens auf einmal nicht mehr verfügbar ist. Nun wäre es aber besser, wenn diese Meldung wiederum einer entsprechenden UI-Komponente zugewiesen werden könnte!?

Wie können nun diese Meldungen den entsprechenden Feldern zugewiesen werden, ohne dass die MVC-Architektur verletzt wird?


----------



## Semerzo (30. Jul 2010)

Also, Validierung ist in JSF so ein Thema 

Erst einmal ein paar Artikel zum Message Handling
Displaying_Errors/Infos/Warnings_in_JSF_Pages - Myfaces Wiki
JSF Validation Tutorial: Error Handling in JSF | Javalobby

Damit kannst Du auch Fehler die während der Verarbeitung passieren in den FacesContext einbringen und über die ID auf ein Eingabefeld beziehen.

Jetzt muss ich ein wenig ausholen:
Nach meinem Wissensstand ist die out-of-the-box Validierung in JSF atomar auf eine Komponente bezogen. Sprich Du kannst, um bei deinem Beispiel zu bleiben, die Formate der Datums-Felder validieren, kein Thema. Aber die Felder auf einander zu beziehen, um sie zu validieren (cross-validation, ist das Ende-Datum auch wirklich nach dem Anfangs-Datum) ist nicht vorgesehen. 

Außer du entwickelst eine eigene Komponente oder findest eine die Datumsbereiche akzeptiert und entsprechend validieren kann. Da kann ich leider nicht weiterhelfen, bisher bin ich noch nicht darüber gestolpert 

Aber um cross-validation in JSF zu einem kleineren Schmerz zu machen, haben sich schon schlauere Leute als ich Gedanken gemacht. Daher würde ich Dir empfehlen extval (Apache MyFaces Extensions Validator) anzuschauen. 

Weiterführend, unabhängig von JSF, könnte der JSR 303: Bean Validation interessant sein, als Hintergrundinformation. Der beschreibt die Konzepte dahinter.


----------



## JSF-Neuling (30. Jul 2010)

Semerzo hat gesagt.:


> Also, Validierung ist in JSF so ein Thema
> Damit kannst Du auch Fehler die während der Verarbeitung passieren in den FacesContext einbringen und über die ID auf ein Eingabefeld beziehen.


Da geb ich dir Recht, aber wo bleibt dann die lose Kopplung des Models?!? Damit muss ich ja zwangsläufig im Model auf den FacesContext zugreifen und die ID der Komponente kennen! Nach dem MVC kennt das Model die View-Technologie doch garnicht und erst recht nicht, wie die einzelnen Komponenten deklariert sind!!!
Ich hatte schon an den Einsatz von Spring Web Flow gedacht, aber sehe dort auf die Schnelle ebenso wenig eine angemessene Lösung, oder täusche ich mich da?



Semerzo hat gesagt.:


> Also, Validierung ist in JSF so ein Thema
> Nach meinem Wissensstand ist die out-of-the-box Validierung in JSF atomar auf eine Komponente bezogen. Sprich Du kannst, um bei deinem Beispiel zu bleiben, die Formate der Datums-Felder validieren, kein Thema. Aber die Felder auf einander zu beziehen, um sie zu validieren (cross-validation, ist das Ende-Datum auch wirklich nach dem Anfangs-Datum) ist nicht vorgesehen.


War vielleicht nicht das beste Beispiel von mir, natürlich wäre diese Prüfung eine Model-Prüfung und nicht Teil der Validierung!


----------



## Semerzo (3. Aug 2010)

Ob und wie Du das lose koppelst und ob dein Model den View kennt, ist deine Sache. Das Model muss den View nicht kennen. Der View muss doch das Model fragen: Na alles valide? Das Model sagt dann, nein, ich habe folgende Liste mit Fehlern. Wie der View das darstellt, ist seine Sache. Der View mappt, dann die Liste der Validierungsfehler auf JSF IDs und entsprechende message keys.

Aber ja, natürlich kannst und solltest Du nach Frameworks schauen die Dir dabei helfen. Der Fokus von Spring *Web Flow* liegt allerdings auf der Abarbeitung komplexer Arbeitsabläufe, die sich über mehrere Eingabemasken erstrecken, z.B. eine Reisebuchung o.ä. Wenn deine Problemstellung ohnehin erfordert, dass Du so ein Framework brauchst, schau es Dir an. Aber auf die schnelle hilft dir das nicht, weil es eben ein Framework ist um ein komplexeres Thema als Validierung zu lösen.

Hast Du denn einen Blick auf extval geworfen?


----------

