enhancement
major
minor
defect
critical
major
minor
major
#30201
Veto gegen die Modellbeschränkungen einlegen: Bei einem fehlgeschlagenen Auftrag (und dessen Protokoll) wird lediglich „Kann nicht gespeichert werden, Beschränkungen verletzt“ angezeigt, ohne dass die Probleme aufgeführt werden.
Problem
ModelService.checkCommit lehnt einen Commit mit der Ausnahme I18NConstants.CONSTRAINTS_VIOLATED („Speichern nicht möglich. Wertüberprüfung fehlgeschlagen.“) ab und fügt die gefundenen Probleme (maximal zehn) als Ursache-Kette der Ausnahme hinzu. Ein Job der View-Ebene (com.top_logic.layout.view.job), der mit dieser Ausnahme fehlschlägt, zeigt dem Benutzer nur die oberste Meldung an, und es wird nichts unter ERROR protokolliert. Der Benutzer erfährt weder, welches Objekt noch welche Einschränkung abgelehnt wurde.
Beobachtet in E-Home (8.0.0-alpha12.817): Ein als Job ausgeführter ETS-Projektimport endet mit „Speichern nicht möglich, Wertüberprüfung fehlgeschlagen“ und sonst nichts; das Serverprotokoll enthält nur die INFO-Zeilen des Imports.
Reproduktion
- Ein Job, dessen Ausführung eine Transaktion festschreibt, die gegen eine Modellbeschränkung verstößt (z. B. eine <constraint-by-expression>, die immer ablehnt).
- Starten Sie den Job aus einer Ansicht heraus; der Fehlerdialog zeigt nur „Speichern nicht möglich, Einschränkungen verletzt.“ an; das Protokoll enthält keinen Eintrag mit den Problemen.
Erwartet
Die Meldung des Veto nennt die Probleme (z. B. die Texte der Ursachen, zusammengefasst), oder die Fehleranzeige des Jobs zeigt die Ursachenkette einer I18NRuntimeException an; der Jobfehler wird mit seinem Stacktrace protokolliert.
Workaround in E-Home
Der Import fängt das Veto beim Commit ab, liest die Ursachen aus und bricht mit einer eigenen Meldung ab, die diese benennt, und protokolliert dies als ERROR.
Lösung
- Ein fehlgeschlagener Job behält die gesamte Fehlermeldung bei: JobRunner beschreibt einen Fehler, der eine Meldung für den Benutzer enthält (an beliebiger Stelle in der Ursachenkette), ähnlich wie ein fehlgeschlagener Befehl (CommandErrors.messages) – die erste internationalisierte Meldung als Fehler, deren Details und die Meldungen der internationalisierten Ursachen darunter (bei einem abgelehnten Commit: die einzelnen Verstöße gegen Einschränkungen) als Fehlerdetails des Jobstatus (JobState.errorDetails()). Jeder andere Fehler beendet den Job weiterhin mit der generischen Meldung „Der Vorgang ist fehlgeschlagen: …“.
- Die Jobstatus-Anzeige (<job-status>, TLJobStatus) listet die Fehlerdetails unterhalb des Fehlers innerhalb ihrer Warnmeldung auf, gestaltet wie die Liste in der Snackbar eines fehlgeschlagenen Befehls (CSS-Element tl-job-status__details).
- Die TL-Script-Funktion `jobErrorDetails(job) ` liefert die Fehlerdetails eines Jobs, neben ` jobError(job)`.
- Ein Job, der mit einem Fehler auf Benutzerebene (internationalisiert) fehlschlägt, wird mit seinem Stack-Trace und allen Meldungen unter „WARN“ protokolliert; ein interner Fehler wird weiterhin unter „ERROR“ protokolliert. Ein Job läuft im Hintergrund, sodass sein Fenster möglicherweise nicht mehr geöffnet ist, wenn er fehlschlägt.
- Die Probleme eines Veto aufgrund von Modellbeschränkungen werden in der Reihenfolge ihrer Feststellung aufgelistet; zuvor wurden sie in der Ursache-Kette (auch in der Snackbar eines fehlgeschlagenen Befehls) in umgekehrter Reihenfolge aufgeführt.
- Demo (tl-demo-react, Demos → Lang laufender Job): Die Schaltfläche „Ungültiges Objekt speichern“ startet einen Job, dessen Commit durch die Modellbeschränkungen abgelehnt wird; die Anzeige listet die beiden verletzten Beschränkungen auf.