2016-06-03 6 views
0

Lassen Sie sich den Fall betrachten:Wiederherstellen von Komponente Rendering Ausfällen in Wicket

Wicket Seite enthält mehrere Komponenten und Rendering von einem von ihnen mit einer gemeinsamen Laufzeitausnahme (wie Nullpointer) ausfällt.

Das Ergebnis sehe ich standardmäßig: die ganze Seite wird nicht gerendert.

Wie von diesem Fehler in Wicket wiederherstellen? Was sollte getan werden, nicht nur die fehlerhafte Komponente rendern oder ersetzen?

+0

Ein Problem, das mir sofort in den Sinn kommt: Nicht alles, was im HTML-Dokument gerendert wird, ist auch für den Benutzer sichtbar. Zum Beispiel hatte ich ein paar Fälle, wo ich JavaScript im laufenden Betrieb konstruieren musste und das Skript innerhalb von Wickets erstellen musste, weil ich Zugriff auf die Markup-IDs benötigte, die Wicket generiert. Was passiert, wenn das Rendern einer solchen Komponente fehlschlägt? Auch wenn das Rendern einer Komponente fehlschlägt, könnten Sie Stilinformationen von dieser Komponente verlieren und Ihre Fehlermeldung könnte woanders enden und nicht dort, wo die korrekt gerenderte Komponente wäre (Das Wicket-Modal-Fenster kommt mir in den Sinn) –

+0

Zur Verdeutlichung: Der obige Kommentar war in Bezug auf die Idee, eine "InternalErrorComponent" -Komponente anstelle der Komponente zu rendern, die nicht gerendert werden konnte. –

Antwort

0

Ein benutzerdefinierter IRequestCycleListener ist die Lösung, nach der Sie suchen. Lesen Carl-Eric Antwort hier:

How to handle exceptions thrown in Wicket custom model?

+0

Diese Lösung ist zu begrenzt, weil sie auf der Tatsache beruht, dass ich über gefährliche Codepunkte weiß, wo Ausnahmen ausgelöst werden können. In realen Anwendungen kann eine Ausnahme an sehr unerwarteten Stellen ausgelöst werden. Zum Beispiel kann ich vergessen, Null-Werte korrekt zu behandeln oder eine Komponente zu einem Baum hinzuzufügen. Die beste Lösung hier könnte sein, eine Art InternalErrorComponent zu haben, die anstelle der ausgefallenen Komponenten gerendert wird. Die Frage ist, ob es eine Möglichkeit gibt, beim Rendern von Komponenten von * all * -Fehlern abzufangen und wiederherzustellen, was sich nicht auf andere Komponenten auf der Seite auswirkt. –

0

In einer „klassischen“ Wicket Anwendung, wo Seiten und Komponenten von Code instanziiert werden in Konstrukteuren und initializers Sie wahrscheinlich Try-Catch-Blöcke manuell zu jeder hinzuzufügen haben und alle möglichen Konstruktoraufruf. Wicket ist kein verwalteter Rahmen, das heißt, es gibt keine zentrale Komponentenfabrik, die durch solche Funktionalität dekoriert werden könnte. Das bedeutet jedoch nicht, dass Sie eine solche Komponentenfabrik nicht selbst erstellen können. In einer CMS-ähnlichen Anwendung, die wir seit 2006 entwickeln, werden alle Wicket-Komponenten von Erstellern instanziiert, die selbst aus xml- oder json-Dokumenten erstellt werden (so wird das gesamte Layout und die Konfiguration der App externalisiert und die Wicket-Komponenten sind) nur kleine Baukästen, die wie Legosteine ​​zusammengemischt werden können - also weiß ich, dass ein solcher Ansatz funktioniert und gut funktioniert. In unserem Fall hat jede Builder-Methode, die eine Komponente erstellt, einen try-catch-Block, der stattdessen ein leeres Label erstellt, wenn eine RuntimeException auftritt.

+0

Wenn die Ausnahme innerhalb eines Stapelrahmens unterhalb des Aufrufs der Seitenkonstruktormethode ausgelöst wird - dies ist definitiv ein vollständiger Seitenfehler, der zu InternalErrorPage führt, wenn er nicht vom Entwickler abgefangen wird. Aber es gibt einen separaten Teil des Renderings in Bezug auf Repeater, die gerendert werden, nachdem Sie den Seitenkonstruktor verlassen haben. Würden Sie hier dieselbe Logik vorschlagen: Umgeben Sie einen Aufruf von populateItem, um {} catch zu versuchen? –

0

Dies ist seltsam meine bescheidene Meinung.

Was schlägt das Rendering der Ersatzkomponente fehl? Zusätzliche Logik hinzufügen? Oder lassen Sie es mit Stack-Überlauffehler fehlschlagen?

Was passiert, wenn die Hälfte der Komponenten auf der Seite ausfällt? Du zeigst die halbe Seite mit dem richtigen Inhalt und die andere mit "Oopsies"?

Wenn es einen Fehler gibt, sollte es behoben werden!

+0

Jede Seite im Wicket kann ein Dutzend unabhängiger Komponenten enthalten. Sobald Wicket InternalErrorPage hat, sehe ich keinen Grund mehr, eine Art InternalErrorComponent zu haben. Die gleiche Logik, aber auf der Ebene der einzelnen Komponenten definiert. Wie auch immer, danke an alle für die Hilfe! –

Verwandte Themen