CodamAIDocs
Themafertig

Das Fehlerformat

Welche Felder eine Fehlerantwort hat und worauf ein Client verzweigen soll.

Ausprägungen
Fehlerantwort von CDMSValidierungsfehler mit violationsAblehnung der FilterketteAntwort ohne KörperStatus 200 in Fehlerform (LENIENT)

Worum es geht

Geht eine Anfrage schief, antwortet CDMS mit einem Fehlerstatus (400 und höher) und einer Fehlerantwort. Die Fehlerantwort ist ein kleines JSON-Objekt ohne data. Es sagt dir, was passiert ist, und zwar so, dass ein Programm es auswerten kann.

Eine Fehlerantwort, beschriftet

Die Rolle zum Lesen fehlt
Anfrage
POST /api/rest/hr/employee/read/5a2b…
{ "response": ["name"] }
Antwort 403, beschriftet
{
  "error":      "MissingPermissionException",   ← Art des Fehlers
  "messageKey": "missing-permission|hr-employee-read",
                 └ Schlüssel ┘ └── Detail ───┘  ← hierauf verzweigen
  "code":       "403",                          ← Status als Text
  "layer":      "validation"                    ← Schicht, nur zur Fehlersuche
}
Feldimmer da?Bedeutungim Client
errorjaName der Fehlerklasse, z. B. ApiValidationExceptionins Protokoll schreiben
messageKeyjafester Schlüssel, oft mit Details nach |hierauf verzweigen
messagenur im Debug-Modus des Serverstechnischer Text der Ursachenie anzeigen, nie auswerten
codejader HTTP-Status als Text, z. B. "422"gleich dem Status der Antwort
layerjaSchicht, in der der Fehler entstandnur zur Fehlersuche
violationsnur bei Validierungsfehlernalle verletzten Feldregeln mit Pfadden Formularfeldern zuordnen
idnur beim Sonderfall LENIENTid des angelegten Objektsmerken, später lesen
stacktracenur im Debug-Modus des Serverstechnischer Aufrufstapelnie auswerten

Der messageKey im Einzelnen

Der messageKey hat die Form schlüssel|detail|detail. Vor dem ersten | steht der Schlüssel, also die Art des Problems. Danach folgen, je nach Fehler, Details wie ein Feldname, ein Rollenname, eine id oder ein Wert.

messageKeySchlüsselDetails
missing-permission|hr-employee-readmissing-permissiondie fehlende Rolle
invalid-value|data.amountinvalid-valuePfad des Feldes im Körper
wrong-value-in-where|amount|abcwrong-value-in-whereFeld und Wert des Filters
recursive-create-not-allowed|employeesrecursive-create-not-alloweddie Beziehung
not-foundnot-foundkeine
validation-failedvalidation-failedkeine, die Einzelheiten stehen in violations
CDMS_OPTIMISTIC_LOCK_CONFLICTCDMS_OPTIMISTIC_LOCK_CONFLICTkeine

So kommst du im Client an den Schlüssel:

Schlüssel und Details trennen
TypeScript
const [key, ...details] = body.messageKey.split('|');
// key     = "missing-permission"
// details = ["hr-employee-read"]
Verzweigen
switch (key) {
  case 'missing-permission': …  // Rolle fehlt
  case 'not-found':          …  // Objekt weg oder unsichtbar
  case 'validation-failed':  …  // violations ins Formular
  default:                   …  // allgemeine Meldung
}

Schlüssel aus der Persistenz sind in Großbuchstaben geschrieben (CDMS_TENANT_REQUIRED), die übrigen klein mit Bindestrich (missing-id). Für den Client ist das egal: Vergleiche den Schlüssel Zeichen für Zeichen, so wie er ist.

Drei Formen von Fehlerkörpern

Nicht jede Ablehnung kommt von CDMS selbst. Die Filterkette von CIAS läuft vorher und antwortet in eigener Form, manche Ablehnungen haben gar keinen Körper.

Wer hat geantwortet?
CDMS
Körper mit messageKey
  • error, messageKey, code, layer
  • jede Ablehnung ab der Rollenprüfung
  • auch 400 für eine Anfrage, die sich nicht lesen lässt
Filterkette, Mandant
403 mit error, ohne messageKey
  • {"error": "cias.authentication.tenant-unresolved", "message": "request refused"}
  • der Mandant ist nicht bestimmbar, wird nicht bedient oder fehlt
  • der Schlüssel steht hier im Feld error
ohne Körper
kein CDMS-JSON
  • 401: Token ungültig oder abgelaufen, Header WWW-Authenticate
  • 403: gar kein Token
  • 404: den Pfad gibt es nicht

Mehr zu den Ablehnungen der Filterkette unter Zugriff ohne Token und 401, 403 oder 404?.

Die Validierung: violations

Nur ein Validierungsfehler hat eine Liste violations. Jeder Eintrag nennt das Feld mit seinem Pfad und die verletzte Regel:

Zwei Pflichtfelder fehlen
Anfrage
POST /api/rest/crm/customer/create
{ "data": { "name": "" }, "response": ["id"] }
Antwort 422
{
  "error": "ApiValidationException",
  "messageKey": "validation-failed",
  "code": "422",
  "layer": "API",
  "violations": [
    { "field": "name",  "rule": "cannot-be-empty" },
    { "field": "email", "rule": "cannot-be-null" }
  ]
}

Wie du die Einträge den Formularfeldern zuordnest, steht unter Validierungsfehler ins Formular bringen. Welche Regeln es gibt: Validierung.

Der Sonderfall: 200 in Fehlerform

Nach einem create im Modus LENIENT kann das Anlegen gelingen und nur das Zurücklesen scheitern. Dann kommt Status 200, aber ein Körper in Fehlerform mit der id des neuen Objekts:

Angelegt, aber nicht zurückgelesen
Antwort 200
{
  "error": "CreateSucceededReadFailedException",
  "messageKey": "CDMS_CREATE_SUCCEEDED_READ_FAILED",
  "code": "200",
  "layer": "system",
  "id": "5a2b…"
}
Was der Client tun sollte
Das Objekt existiert.
Die id merken und später lesen,
NICHT noch einmal anlegen.

Siehe Anlegen und Zurücklesen: STRICT oder LENIENT.

So wertet ein Client aus

Eine Antwort auswerten
  1. 1
    Client
    Status 2xx?
  2. 2
    Client
    ja, und messageKey ist CDMS_CREATE_SUCCEEDED_READ_FAILED → angelegt, id merken
  3. 3
    Client
    ja, sonst → data verwenden
  4. 4
    Client
    nein → Körper lesen, wenn es einen gibt. Hat er einen messageKey?
  5. 5
    Client
    ja → Schlüssel vor dem ersten | auswerten, bei 422 zusätzlich violations
  6. 6
    Client
    nein → am Status entscheiden: 401 Token erneuern, 403 mit error Mandant prüfen, sonst allgemeine Meldung

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-rest-api – CdmsExceptionMapper (handleCmsException, handleDefault), ClientErrorTranslator
  • commons – AbstractCodamaiException (httpStatusCode, messageKey, layer, embedded, violations), FieldViolation, GlobalProperties
  • CDMS/cdms-commons – exceptions (ApiValidationException, CreateSucceededReadFailedException u. a.)
  • commons-persistence – CodamaiPersistenceException, PersistenceErrorCode
  • CIAS/cias-authentication – JwtSessionFilter.refuse, SessionConfig (Http403ForbiddenEntryPoint, oauth2ResourceServer), RequestAdmission
  • documentation/05-api-guide/10-fehler.md, 20-api/06-fehler-und-statuscodes.md
Suchen