Zum Inhalt springen

Fehler und Statuscodes

Kurzantwort: Alle CDMS-Fehler erben von AbstractCodamaiException und tragen HTTP-Status, messageKey und die verursachende Schicht. Der zentrale CdmsExceptionMapper (@ControllerAdvice) baut daraus eine einheitliche JSON-Antwort und markiert den gesamten Request als rollback-only – ein fehlgeschlagener Request committet nichts, auch nicht teilweise.


{
"error": "ApiValidationException",
"message": "validation-failed",
"messageKey": "CDMS_VALIDATION_FAILED",
"code": "422",
"layer": "API",
"violations": [
{ "field": "name", "rule": "cannot-be-null" }
],
"stacktrace": "…"
}
FeldBedeutung
erroreinfacher Klassenname der Exception
messageNachricht, ggf. aus der eingebetteten Ursache
messageKeystabiler Schlüssel für Übersetzungen
codeHTTP-Status als String
layerapi, system, database, hook
violationsnur bei Feldvalidierung: Feldpfad plus verletzte Regel
idnur bei CreateSucceededReadFailedException: die angelegte ID
stacktracenur wenn codamai.debug = true

Ein unerwarteter Fehler (keine CodamAI-Exception) wird als 500 mit messageKey: "details see logfiles" beantwortet – Interna gehen ins Log, nicht in die Antwort.

StatusExceptionWann
200CreateSucceededReadFailedExceptionTeilerfolg: Anlegen hat geklappt, Zurücklesen nicht (LENIENT); die Antwort trägt die id
400ApiBadRequestExceptionfehlerhafter Request, fehlende ID im Patch
400InvalidQueryDefinitionExceptionresponse fehlt, ungültige Abfragedefinition
400PayloadMappingExceptionPayload lässt sich nicht abbilden
400DatabaseConstraintViolationExceptionverletzte Datenbankbedingung, ungültige UUID
400RecursiveOperationNotAllowedverschachtelter Create ohne RecursiveType.CREATE (Strict Mode)
403NoRecursiveAllowedunerlaubte rekursive Operation
403MissingPermissionExceptionRolle fehlt (Strict Mode)
404ApiNotFoundExceptionObjekt nicht gefunden
404EntityNotFoundExceptionZeile nicht vorhanden oder unter den Filtern nicht sichtbar
409ApiConflictExceptionKonflikt
413FileUploadExceptionUpload fehlgeschlagen, fehlende oder doppelte Dateinamen
422ApiValidationExceptionFeldregeln verletzt – mit violations
422HookValidationExceptionein Hook lehnt fachlich ab
422AttributeValidationExceptionProfilattribut fehlt oder ist leer
500SystemConfigurationExceptionFehlkonfiguration, unbekanntes Feld, Modell nicht auditiert
500SystemInitializationExceptionStartfehler
500HookExecutionExceptionHook wirft technisch
500DatabaseConnectionExceptionVerbindungsfehler
500FileStorageExceptionStorage-Fehler
500ArchiveOperationExceptionArchivierungsfehler
500AuditWriteExceptionRevision konnte nicht geschrieben werden
503DataIntegrityExceptionIntegritätsproblem, z. B. beim Löschen referenzierter Daten
CodeStatusBedeutung
CDMS_PERSISTENCE_CONTEXT_MISSING500kein Request-Kontext vorhanden
CDMS_TENANT_REQUIRED400Mandantenobjekt ohne effektiven Mandanten
CDMS_TENANT_NOT_SERVED403Mandant ist im Katalog nicht aktiv/gültig
CDMS_TENANT_SWITCH_NOT_AUTHORIZED403Mandantenwechsel nicht erlaubt
CDMS_TENANT_DATASOURCE_NOT_FOUND500Mandanten-Datenbank existiert nicht
CDMS_TENANT_DATASOURCE_UNAVAILABLE503Datenbank nicht erreichbar
CDMS_ENTITY_MANAGER_CREATION_FAILED500Persistenzkontext ließ sich nicht aufbauen
CodeBedeutung
CDMS_FILE_STORAGE_NOT_CONFIGUREDbasePath fehlt
CDMS_FILE_CONTEXT_MISSINGmandantengebundene Operation ohne Request-Kontext
CDMS_FILE_TENANT_REQUIREDKontext ohne Mandant
CDMS_FILE_TENANT_INVALIDMandantenkennung unzulässig (Muster [a-zA-Z0-9._-]+, kein ..)
CDMS_FILE_SOURCE_MISSINGQuelldatei zum Speichern nicht vorhanden

Zusätzlich als Nachrichtenschlüssel: file-not-saved, file-not-found, file-version-not-found, could-not-delete-file.

file-storage-not-configured fällt aus der Reihe: Es meldet keinen Speicherfehler, sondern eine fehlende Entscheidung – das System hat ein Datei-Modell, aber storage: NONE. Siehe Dateien und Storage.

SchlüsselSituation
missing-idPATCH ohne id im data
missing-object|<id>|<klasse>referenziertes Objekt existiert nicht
missing-type-for-abstract-field|<feld>@type fehlt beim Anlegen auf einer abstrakten Beziehung
recursive-create-not-allowed|<feld>Beziehung erlaubt kein rekursives Anlegen
missing-create-role / missing-update-role / missing-rollback-roleRolle fehlt
missing-permission|<rolle>Klassenrolle fehlt (Strict Mode)
missing-attribute-on-profile|<attribut>Profilattribut fehlt
empty-attribute-on-profile|<attribut>Profilattribut ohne Wert
object-already-exists|use-updateSingleton existiert bereits
no-data-exists|use-createSingleton existiert noch nicht
duplicate-filenames|<namen>doppelte Dateinamen im Upload
model-not-auditedHistorie eines nicht auditierten Modells angefragt
sequenceDiagram
    participant C as Client
    participant M as CdmsExceptionMapper
    participant P as Persistenz
    C->>M: Request wirft RuntimeException
    M->>P: markRollbackOnly()
    Note over P: gilt für ALLE berührten Ziele<br/>(System- und Mandanten-DB)
    M-->>C: strukturierte Fehlerantwort
    Note over P: Request-Ende rollt zurück statt zu committen

Ohne diese Markierung könnte eine Operation, die System- und Mandantendatenbank berührt hat, das eine Ziel zurückrollen und das andere committen. markRollbackOnly() wirft selbst nie und ist damit auch aus einem finally sicher aufrufbar.

Alle Verstöße eines Requests reisen in einer 422-Antwort, jeder mit vollem Feldpfad inklusive Verschachtelung. Ein Formular kann damit alle fehlerhaften Felder auf einmal markieren, statt einen pro Umlauf.

Verfügbare Regelverstöße: cannot-be-null, cannot-be-empty, too-long, pattern-mismatch, min-number, max-number.