CodamAIDocs
Themafertig

Landkarte der Statuscodes

Jeder Statuscode mit den Situationen, in denen CDMS ihn liefert: 200, 400, 401, 403, 404, 409, 413, 422, 500, 503.

Ausprägungen
200 (auch LENIENT-Sonderfall)400401403404409413422500503

Worum es geht

Jede Antwort hat einen HTTP-Statuscode, eine dreistellige Zahl. Die erste Ziffer sagt, wer handeln muss:

  • 2xx: Es hat geklappt.
  • 4xx: Die Anfrage passt nicht. Der Client muss etwas ändern, bevor ein neuer Versuch Sinn hat.
  • 5xx: Im Server ist etwas schiefgegangen. Der Client kann an der Anfrage nichts verbessern.

Wo die Codes entstehen

Eine Anfrage läuft durch mehrere Stationen. Jede Station hat ihre eigenen Codes:

Der Weg einer Anfrage und ihre Ablehnungen
  1. CIAS
    Filterkette
    Gibt es ein gültiges Token? Lässt sich der Mandant bestimmen?
    ↳ nein 401 Token ungültig · 403 kein Token oder Mandant abgelehnt
  2. CDMS
    Weiterleitung
    Gibt es diesen Pfad?
    ↳ nein 404 ohne messageKey
  3. CDMS
    REST-Layer
    Lässt sich der Körper lesen? Sind data und response da?
    ↳ nein 400 · 413 Upload zu groß
  4. CDMS
    System-Layer
    Rolle, Sichtbarkeit, Beziehungen, Feldregeln, Hooks
    ↳ nein 403 · 404 · 400 · 422
  5. Datenbank
    Persistenz
    Nimmt die Datenbank die Änderung an?
    ↳ nein 409 Wert schon vergeben oder Objekt noch verwiesen · 409 gleichzeitige Änderung · 400 Wert passt nicht in die Spalte · 503 Datenbank nicht erreichbar
  6. 200 mit data, die Änderung ist festgeschrieben

Wann Rolle und wann Sichtbarkeit zuerst geprüft wird, steht unter 401, 403 oder 404?.

Die Matrix

Codeheißttypische Situationen und messageKeynochmal versuchen?
200erfolgreichLesen, Suchen, Anlegen, Ändern, Löschen, Rollback. Sonderfall: angelegt, aber nicht zurückgelesen (CDMS_CREATE_SUCCEEDED_READ_FAILED)–
400Anfrage fehlerhaftJSON nicht lesbar, Wert passt nicht zum Feld, response oder data fehlt, Filter mit falschem Wert, Anlegen über eine Beziehung nicht erlaubt, Wert passt nicht in die Datenbankspalteerst nach einer Korrektur
401Token ungültigToken abgelaufen, kaputt oder falsch signiertnach dem Erneuern des Tokens, einmal
403nicht erlaubtkein Token, Mandant abgelehnt, Rolle fehlt (missing-permission|<rolle>), Mandantenwechsel nicht erlaubtnein
404nicht gefundenObjekt gibt es nicht oder es ist für dich unsichtbar, Singleton noch nicht angelegt, Pfad unbekanntnein
409Konflikteindeutiger Wert schon vergeben (already-exists), Objekt wird noch verwiesen (database-integrity-failed), zwei Anfragen schreiben gleichzeitig einen neuen Inhalt in dasselbe Datei-Objektbei already-exists und database-integrity-failed erst nach einer Korrektur, sonst nach neuem Lesen
413Upload zu großeine Datei (file-too-large|<bytes>), alle Dateien zusammen (request-too-large|<bytes>) oder die Zahl der Teile (too-many-parts|<anzahl>) über der Grenzeerst nach einer Korrektur
422Inhalt verletzt RegelnFeldregeln verletzt (validation-failed mit violations), Hook lehnt ab, Profilattribut fehlterst nach einer Korrektur
500Serverfehlerunerwarteter Fehler im Server oder ein Fehler in der Einrichtung des Projektsmeist zwecklos
503Datenbank nicht erreichbarder Datenbankserver antwortet nicht, die Verbindung bricht ab, eine Sperre wird nicht rechtzeitig frei, die Datenbank bricht eine Verklemmung abnach einer Pause

Was nach jedem Code gespeichert ist und wie du wiederholst, steht unter Darf der Client wiederholen?.

200: erfolgreich

Jede erfolgreiche Anfrage liefert 200, auch ein create und ein delete. Codes wie 201 oder 204 gibt es nicht. Ein Löschen antwortet mit leerem Körper, alles andere mit data. Siehe Das Antwortformat.

Einen Sonderfall gibt es: Im Modus LENIENT kann ein create gelingen und nur das Zurücklesen scheitern. Dann kommt 200 mit einem Körper in Fehlerform, dem messageKey CDMS_CREATE_SUCCEEDED_READ_FAILED und der id des neuen Objekts. Das Objekt ist gespeichert, lege es nicht noch einmal an. Siehe Anlegen und Zurücklesen.

400: die Anfrage ist fehlerhaft

400 heißt: So, wie die Anfrage ist, kann CDMS sie nicht ausführen. Der messageKey sagt, was nicht passt, oft mit dem Pfad oder Feld dahinter.

BereichmessageKeySeite
Körper nicht lesbarmalformed-json, unreadable-bodyValidierung
Wert passt nicht zum Feldinvalid-value|<pfad>, z. B. Text in einem ZahlfeldValidierung
Teil der Anfrage fehltresponse, missing-data, missing-id, missing-parameterEin Objekt lesen
Pfadangabe hat den falschen Typinvalid-parameter|<name>, z. B. eine id, die keine UUID ist–
Filter oder Sortierung falschwrong-value-in-where|…, wrong-uuid-in-where|…, like-needs-text|…, wrong-order-element-exceptionWenn ein Filter nicht passt
Beziehung erlaubt kein Anlegenrecursive-create-not-allowed|<feld>Die vier Fälle
Untertyp fehlt oder unbekanntmissing-type-for-abstract-field|…, unknown-type-for-abstract-field|…Abstrakte Modelle
Datenbank nimmt einen Wert nicht an, z. B. länger als die Spalte oder leer in einer Pflichtspalteconstraint-violationValidierung
Verweis zeigt beim Speichern auf ein Objekt, das es nicht (mehr) gibtunknown-referenceDie vier Fälle
Singleton gibt es schonobject-already-exists|use-updateSingleton
Datei-Objekt ohne passende Dateifile-part-missing|<name>, file-name-missingHochladen
Mandant fehltCDMS_TENANT_REQUIREDWoher der Mandant kommt

401 und 403: wer du bist und was du darfst

401 kommt nur von der Filterkette: Das Token ist abgelaufen, kaputt oder falsch signiert. Die Antwort hat keinen Körper, aber den Header WWW-Authenticate: Bearer error="invalid_token". Erneuere das Token und wiederhole die Anfrage einmal.

403 heißt: Diese Anfrage ist für dich nicht erlaubt. Es gibt drei Quellen:

Quelleworan du sie erkennstBeispiel
Filterkette, kein TokenKörper ohne messageKeyHeader Authorization fehlt
Filterkette, MandantFeld error mit cias.authentication.…cias.authentication.tenant-unresolved
CDMSmessageKeymissing-permission|hr-employee-read, ohne Strict Mode missing-create-role u. a., CDMS_TENANT_SWITCH_NOT_AUTHORIZED

Siehe Zugriff ohne Token, Modellrollen und Strict Mode.

404: nicht gefunden

404 mit messageKey heißt: Das Objekt gibt es nicht, oder du darfst es nicht sehen. CDMS unterscheidet das absichtlich nicht. Typische Schlüssel sind not-found, not-found|<Dto>|<id>, missing-object|… für ein fehlendes Kind in einer Beziehung und no-data-exists|use-create bei einem Singleton, das es noch nicht gibt.

404 ohne messageKey heißt: Den Pfad gibt es nicht. Meist ist der Modellpfad falsch geschrieben, oder das Modell hat diesen Endpunkt nicht. Siehe Warum Unsichtbares 404 liefert und Welche Endpunkte ein Modell hat.

409: Konflikt

409 heißt: Die Änderung passt nicht zu den Daten, die schon gespeichert sind. Nichts ist gespeichert. Es gibt drei Fälle:

SituationmessageKeywas tun
ein eindeutiger Wert oder die id ist schon vergebenalready-existsnicht wiederholen: Den Wert gibt es schon. Anderen Wert wählen oder das vorhandene Objekt ändern
ein anderes Objekt verweist beim Speichern noch auf dieses, etwa weil der Verweis gleichzeitig entstanden ist. Verweise über das Modell löst CDMS beim Löschen selbst, siehe Abhängige Objekte (Kaskaden)database-integrity-failednicht wiederholen: erst den Verweis lösen
zwei Anfragen schreiben gleichzeitig einen neuen Inhalt in dasselbe Datei-Objekt, die zweite verliertCDMS_OPTIMISTIC_LOCK_CONFLICTObjekt neu lesen, dann noch einmal versuchen

Den gleichzeitigen Schreibkonflikt gibt es nur bei Datei-Modellen, bei allen anderen Modellen gewinnt die letzte Änderung ohne Fehler. Siehe Gleichzeitige Änderungen.

422: der Inhalt verletzt Regeln

422 heißt: Die Anfrage ist richtig gebaut, aber ihr Inhalt verletzt eine Regel.

Drei Arten von 422

Wann: Pflichtfeld leer, Text zu lang, Muster, Mindest- oder Höchstwert, Datum

messageKey validation-failed. In violations stehen alle Verstöße der Anfrage, jeder mit Feldpfad und Regel.

Ergebnis: Siehe Validierungsfehler ins Formular bringen.

Wann: Die Fachlogik des Projekts wirft einen Validierungsfehler.

layer ist hook, den messageKey wählt der Hook. Es gibt kein violations.

Ergebnis: Siehe Wenn ein Hook scheitert.

Wann: Ein Attributfilter braucht einen Wert aus deinem Profil, und der fehlt oder ist leer.

missing-attribute-on-profile|<attribut> oder empty-attribute-on-profile|<attribut>, ohne violations.

Ergebnis: Nicht die Daten sind falsch, sondern das Profil der Person. Siehe Attributfilter.

500: Fehler im Server

500 heißt: Im Server ist etwas passiert, das der Client nicht beheben kann. Es gibt zwei Arten:

  • Unerwarteter Fehler. Der messageKey ist details see logfiles, layer ist undefined. Die Ursache steht im Server-Log.
  • Fehler in der Einrichtung. Das Projekt ist falsch eingerichtet, der messageKey nennt es. Beispiele: unresolvable-mandatory-filter|… bei einem Filter auf ein Feld, das es nicht gibt, und CDMS_TENANT_DATASOURCE_NOT_FOUND, wenn die Datenbank des Mandanten fehlt.

Auch eine unerwartete Ausnahme in einem Hook endet mit 500. Eine Wiederholung hilft in keinem dieser Fälle. Gib Status, messageKey und Zeitpunkt an das Team weiter.

503: die Datenbank ist nicht erreichbar

503 heißt: Die Datenbank kann die Anfrage gerade nicht bedienen. Nichts ist gespeichert, die Transaktion ist zurückgerollt. Das ist eine Störung, kein Fehler in deinen Daten: Eine Wiederholung nach einer Pause kann gelingen.

SituationmessageKey
der Datenbankserver des Mandanten ist nicht erreichbarCDMS_TENANT_DATASOURCE_UNAVAILABLE
die Verbindung bricht während der Anfrage abdatabase-unavailable|connection
eine Sperre auf dem Objekt wird nicht rechtzeitig freidatabase-unavailable|lock-timeout
die Datenbank bricht die Anfrage wegen einer Verklemmung mit einer anderen abdatabase-unavailable|deadlock

Lehnt die Datenbank eine Änderung dagegen wegen der vorhandenen Daten ab, kommt 409, und eine unveränderte Wiederholung scheitert genauso. Siehe oben.

Ablehnungen beim Hochladen

Beim Hochladen von Dateien lehnt CDMS eine Anfrage mit 400 ab, wenn zwei Teile denselben Dateinamen haben (duplicate-filenames|<name>), ein Teil keinen Dateinamen hat (missing-filename) oder sich der Multipart-Körper nicht lesen lässt (malformed-multipart). Ist eine Datei, der ganze Request oder die Zahl der Teile zu groß, kommt 413, und der messageKey nennt die Grenze, etwa file-too-large|26214400 (Bytes). Prüfe Namen und Größe schon im Client. Siehe Hochladen und Größengrenzen.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-rest-api – CdmsExceptionMapper, ClientErrorTranslator, AbstractRestApi, AbstractRestSingletonApi, AbstractHubApi, Expander
  • CDMS/cdms-commons – exceptions (ApiBadRequestException 400, InvalidQueryDefinitionException 400, DatabaseConstraintViolationException 400, RecursiveOperationNotAllowed 400, EntityNotFoundException 404, ApiNotFoundException 404, FileUploadException 413, ApiValidationException 422, HookValidationException 422, DataIntegrityException 409, DatabaseUnavailableException 503, CreateSucceededReadFailedException 200)
  • commons – AbstractCodamaiException, NoAccessException 403, NotFoundException 404, UndefinedInternalException 500
  • commons-persistence – PersistenceErrorCode (CDMS_TENANT_REQUIRED, CDMS_TENANT_SWITCH_NOT_AUTHORIZED, CDMS_OPTIMISTIC_LOCK_CONFLICT, CDMS_TENANT_DATASOURCE_UNAVAILABLE u. a.)
  • CDMS/cdms-authorization – MissingPermissionException 403, AttributeValidationException 422
  • CDMS/cdms-persistence-database – AbstractDatabasePersistence (createObject, flush, lockForUpdate), PersistenceFailureTranslator, DatabaseHubPersistence.commit, DatabaseConditionBuilder
  • CDMS/cdms-system-layer – AbstractSystemLayer, AbstractLayer
  • CIAS/cias-authentication – SessionConfig, JwtSessionFilter, RequestAdmission
  • documentation/20-api/06-fehler-und-statuscodes.md, 05-api-guide/10-fehler.md
Suchen