CodamAIDocs
Themafertig

Die Payload und ihre Prüfung

Was in der Payload stehen darf: höchstens zwei Ebenen, nur einfache Werte. Wie CRMS die Felder prüft, die eine Vorlage deklariert, und wie Verstöße mit Feldpfad und Regel-Schlüssel zurückkommen.

Ausprägungen
einfacher Wert, Liste von WertenObjekt mit einer EbeneListe von Objektenzu tief → depth-exceededdeklariertes Feld fehlt, falscher Typ, keine Liste, kein Objektzu groß → payload-too-large

Worum es geht

Die Payload sind die Daten, die eine Vorlage in das Dokument einsetzt: Kundenname, Positionen, Datum. Deine Anwendung stellt sie zusammen. CRMS rechnet nicht, lädt nichts nach und folgt keinen Verweisen. Es setzt nur ein, was du schickst.

Darum prüft CRMS die Payload, bevor die Vorlage sie sieht. Es gibt zwei Prüfungen:

  1. Die Struktur, für jede Payload: höchstens zwei Ebenen und nur einfache Werte.
  2. Die deklarierten Felder: Eine Vorlage kann festlegen, welche Felder sie erwartet, mit Typ und ob sie Pflicht sind. CRMS prüft die Payload gegen diese Angaben.

Eine gültige Payload

{
  "title": "Begehung Halle 3",
  "approved": true,
  "tags": ["Brandschutz", "Fluchtwege"],
  "customer": { "name": "ACME", "city": "Köln", "phones": ["0221 1234"] },
  "items": [
    { "label": "Feuerlöscher geprüft", "amount": 480.00 },
    { "label": "Notausgang frei", "amount": 120.50 }
  ],
  "due": "2026-10-17"
}
WertFormEbenen
title, approved, dueeinfacher Wert1
tagsListe einfacher Werte1
customerObjekt mit einfachen Werten oder Listen einfacher Werte2
itemsListe von Objekten mit einfachen Werten oder Listen einfacher Werte2

Einfache Werte sind Text, Zahlen, true/false, Datumsangaben und Zeitpunkte. null ist überall erlaubt. Eingebettet darfst du auch Java-Datumswerte schicken: LocalDate, OffsetDateTime, ZonedDateTime, Instant. Über JSON kommen Datumsangaben als ISO-Text, siehe unten.

Beliebige Java-Objekte sind nicht erlaubt. Ein Objekt brächte seine Methoden in die Vorlage mit, und genau das soll die Sandbox verhindern.

Die Strukturregeln

Wo steht der Wert?Was ist er?Ergebnis
obeneinfacher Wert oder nullerlaubt
obenListe einfacher Werteerlaubt
obenObjekterlaubt, seine Werte werden auf Ebene 2 geprüft
obenListe von Objektenerlaubt, jedes Objekt wird auf Ebene 2 geprüft
obenListe von Listendepth-exceeded
Ebene 2einfacher Wert oder Liste einfacher Werteerlaubt
Ebene 2Objekt oder Liste mit Objekten oder Listendepth-exceeded
–anderes Objekt oder unendliche Zahlvalue-type-unsupported
Ebene 2Schlüssel leer oder kein Textkey-invalid

Vor allem anderen schätzt CRMS die Größe der Payload. Ist sie größer als die Grenze der Installation (Standard 5 MiB, CODAMAI_CRMS_PAYLOAD_MAX_BYTES), kommt nur ein Verstoß zurück: Feld payload, Regel payload-too-large|<Grenze>. Die Grenze gilt auch für ein SVG in der Payload.

Die deklarierten Felder

Eine Revision einer Vorlage kann ihre Felder deklarieren. Jede Deklaration hat vier Teile:

TeilBedeutungBeispiel
pathwo das Feld steht: ein Name, objekt.name oder liste[].name. Höchstens zwei Ebenen, nur die erste darf eine Liste von Objekten seincustomer.name, items[].amount
typeSTRING, NUMBER, BOOLEAN, DATE oder DATETIMENUMBER
requiredob das Feld da und nicht null sein musstrue
listob das Feld eine Liste von Werten dieses Typs istfalse

Wie du Felder in einer Vorlage deklarierst, steht unter Wie eine Vorlage aufgebaut ist. Für die Prüfung gilt:

  • Nicht deklarierte Werte sind erlaubt. Eine Vorlage darf mehr verwenden, als sie deklariert. Für sie gelten nur die Strukturregeln.
  • DATE passt auf ein Datum oder auf ISO-Text wie "2026-10-17".
  • DATETIME passt auf einen Zeitpunkt oder auf ISO-Text mit Zeitzonen-Versatz, etwa "2026-10-17T08:30:00+02:00" oder "…Z". Ohne Versatz ist es ein Verstoß.
  • NUMBER passt auf jede Zahl, nicht auf Text wie "480".
  • Bei items[].amount prüft CRMS jedes Element der Liste einzeln.
RegelBedeutung
requiredein Pflichtfeld fehlt oder ist null
type|string, type|number, type|boolean, type|date, type|datetimeder Wert hat nicht den deklarierten Typ
list-expectedeine deklarierte Liste oder Liste von Objekten ist keine Liste
object-expectedein deklariertes Objekt oder ein Listenelement ist kein Objekt

Wie Verstöße zurückkommen

CRMS sammelt alle Verstöße und antwortet einmal: 422 mit dem Schlüssel payload-rejected und der Liste violations. Jeder Verstoß nennt den Pfad des Werts und eine Regel. Ein Wert aus deiner Anfrage wird nie zurückgeschickt.

Anfrage (Vorlage deklariert items[].amount als NUMBER, due als DATE)
POST /crms/render
{
  "template": "audit-report", "format": "PDF", "mode": "PREVIEW",
  "data": {
    "items": [
      { "label": "Feuerlöscher", "amount": "480" },
      { "label": "Notausgang", "amount": 120.5,
        "detail": { "note": "zu tief" } }
    ],
    "due": "17.10.2026"
  }
}
Antwort
HTTP 422
{
  "messageKey": "payload-rejected",
  "code": "422",
  "layer": "crms",
  "violations": [
    { "field": "items[1].detail", "rule": "depth-exceeded" },
    { "field": "items[0].amount", "rule": "type|number" },
    { "field": "due", "rule": "type|date" }
  ]
}

Die Strukturverstöße stehen vor den Verstößen gegen deklarierte Felder. Die Regel-Schlüssel übersetzt dein Frontend, siehe Fehler und Message Keys. Prüfen kannst du eine Payload auch ohne Rendern, mit POST /crms/render/validate, siehe Die Render-Anfrage.

Was die Vorlage danach sieht

Die Vorlage bekommt eine Kopie der geprüften Payload. Dabei macht CRMS aus jedem Feld, das als DATE oder DATETIME deklariert ist, einen echten Datumswert, auch wenn er als ISO-Text kam. So kann die Vorlage ihn in der Sprache und Zeitzone des Dokuments formatieren. Ein Kalenderdatum gilt als Mitternacht in der Zeitzone des Dokuments. Mehr unter Sprache und Zeitzone.

Fallen

Weiter

Suchen