Lieferantenexport mit Java oder Kotlin prüfen
Du erhältst im Autohaus einen CMD-Export eines Lieferanten. Prüfe rohes JSON zuerst mit dem Schema-Validator: eine separate Voraussetzung, keine SDK-Funktion. Lies das gewählte Profil, prüfe Verstöße und übernimm das normalisierte Dokument nur bei Erfolg. Dieses vollständige Beispiel nutzt eine fiktive Party, ohne FIN, Adresse oder generell verpflichtende Firmenkennung.
Lokales JAR einbinden
Nutze com.pobbd:cmd-sdk:0.26.0 mit Java 17+. Java und Kotlin teilen JAR und
API com.pobbd.cmdsdk; ein separates Kotlin-Multiplatform- oder Android-SDK gibt es
nicht. Baue ein lokales JAR im Verzeichnis packages/java/sdk:
make check-quality
QA nutzt Temurin 17.0.21+9, Maven 3.10.0 und Python 3.10+; der genaue
QA-Patchstand ist vom Verbraucher-/Compiler-Release-Level 17 getrennt. Die Prüfung
installiert das Artefakt lokal und prüft separate Java-/Kotlin-Verbraucher.
Deklariere in einer Maven-Anwendung mit demselben lokalen Repository:
<dependency>
<groupId>com.pobbd</groupId>
<artifactId>cmd-sdk</artifactId>
<version>0.26.0</version>
</dependency>
Standardrepository ist .cache/maven im SDK-Paket, nicht das gewöhnliche
~/.m2/repository des Verbrauchers. Wähle bei dessen Maven-Aufrufen das absolute
Verzeichnis mit -Dmaven.repo.local=/absolute/path/to/packages/java/sdk/.cache/maven.
Jackson databind/core 2.22.4 und annotations 2.22 sind Laufzeitabhängigkeiten;
das SDK benötigt keine Kotlin-Laufzeit.
Lesen, prüfen, schreiben
Speichere das Beispiel als ExportCheck.java im Quellverzeichnis deiner Anwendung:
import com.pobbd.cmdsdk.CmdSdk;
import com.pobbd.cmdsdk.Models;
public final class ExportCheck {
public static void main(String[] args) {
String json = """
{
"parties": [
{
"id": "party_example",
"organization_name": "Fictional supplier"
}
]
}
""";
Models.TypeBundle bundle = (Models.TypeBundle) CmdSdk.read(
json, "type", "0.26");
var violations = CmdSdk.validate(bundle);
if (!violations.isEmpty()) {
throw new IllegalArgumentException(violations.toString());
}
Models.Party party = bundle.parties().value().get(0);
System.out.println(party.organization_name().value());
System.out.println(CmdSdk.write(bundle));
}
}
Erwarte Fictional supplier, danach JSON mit derselben Party. Lesen erzeugt
typisierte DTOs, keinen Beweis für fachliche Gültigkeit oder Firmenidentität.
Werte Verstöße über code(), path(), parameters() und message() aus; manche
Callback-Codes sind null. Lehne fehlerhafte Exporte vor dem Speichern ab oder isoliere
sie nach Anwendungsrichtlinie.
Kotlin nutzt dieselben Java-Record-Zugriffe, einschließlich parties().value():
import com.pobbd.cmdsdk.CmdSdk
import com.pobbd.cmdsdk.Models
fun main() {
val json = """
{
"parties": [
{
"id": "party_example",
"organization_name": "Fictional supplier"
}
]
}
""".trimIndent()
val bundle = CmdSdk.read(json, "type", "0.26") as Models.TypeBundle
check(CmdSdk.validate(bundle).isEmpty())
val party = bundle.parties().value()[0]
println(party.organization_name().value())
println(CmdSdk.write(bundle))
}
Präsenz und strikte Eingaben erhalten
CmdSdk.read(json, profile, version) akzeptiert nur type, instance, recall
und Austauschversion 0.26, nicht Paketversion 0.26.0. Andere Auswahlen,
unbekannte Felder/Enums, fehlende Pflichtschlüssel, falsche Skalartypen und unsichere
Zahlen werfen IllegalArgumentException. Behandle Dekodierungsfehler getrennt von
zurückgegebenen fachlichen Verstößen.
readDto(json, Models.Party.class) liest ein einzelnes DTO.
DTO-Records liegen in Models, Enums in Codes. Bei eigener Konstruktion gilt:
| Wert | Bedeutung nach Normalisierung |
|---|---|
Field.absent() | Eigenschaft ausgelassen |
Field.nullValue() | JSON-Null ausdrücklich vorhanden |
Field.of(0L) | Numerische Null vorhanden |
Field.of(List.of()) | Leere Liste vorhanden |
Field.present() unterscheidet fehlend von vorhanden-null; value() allein nicht.
Die nullable Pflichtschlüssel Vehicle.first_registration und
VehicleDamage.component dürfen nicht fehlen. Präsenzerhalt macht optionale Nullwerte
nicht schemagültig. normalize(dto) liefert eine JSON-taugliche Map;
write(dto) schreibt JSON ohne Standardwerte einzufügen. Zahlenschreibweise,
Leerraum und doppelte Schlüssel sind keine Roundtrip-Garantien. Ganzzahlen nutzen
Long, andere Zahlen Double, mit Betrag höchstens 9007199254740991;
dies ist keine Dezimal-API mit beliebiger Genauigkeit.
Partiellen oder geschlossenen Graph wählen
validate(bundle) verbindet Feldprüfungen mit einem dokumentlokalen partiellen
Graphen. Sichtbare Widersprüche scheitern, externe Referenzen dürfen unaufgelöst
bleiben. Für mehrere Dokumente erhält CmdSdk.validateGraph(map, false) eine
Map<String, ? extends Models.Bundle>. Map-Schlüssel kennzeichnen Fehlerpfade.
Nutze für einen geschlossenen Graphen CmdSdk.validateGraph(map, true) oder die
Standardüberladung. Gib alle erforderlichen referenzierten Datensätze mit.
Eine Source mit Verweis auf party_example kann ohne Party partiell bestehen,
scheitert aber geschlossen, bis eine kompatible Party vorliegt. Das reine
Party-Beispiel besteht beide Prüfungen. Kein Modus lädt Datensätze nach oder deutet
ID-Präfixe. Validierungsgrenzen erklären speichereigene Regeln.
Vereinbarung des Empfängers anwenden
CmdSdk.validateContract(payload, references, trusted, context) prüft bilaterale
Vollständigkeit zusätzlich zu Kernregeln und geschlossenem Graphen. Der Empfänger
wählt einen vertrauenswürdigen Models.DataContract und erzeugt einen unabhängigen
ContractContext aus vertrauenswürdiger Konfiguration mit sechs exakten Bindungen:
| Bindung | Erwarteter Wert |
|---|---|
contract_id, contract_version | Vereinbarung und unveränderliche Revision |
publisher_party_id, consumer_party_id | Lieferant und empfangendes Autohaus, gerichtet |
profile, cmd_version | Vereinbartes Austauschprofil und 0.26 |
Eingehende data_contracts dürfen die Richtlinie nicht auswählen oder abschwächen.
Unter einer ID/Version ist die gesamte logische Definition unveränderlich.
Alternativen sind inklusives ODER; jede Anforderung einer gewählten Alternative
muss für jedes gewählte Ziel gelten. min_occurs verhindert zufälligen Erfolg bei
leerer Zielmenge. FIELD-Pfade benennen deklarierte verschachtelte DTO-Eigenschaften,
keine freien Ausdrücke, Listenpfade oder Referenzauflösung. IDENTIFIER prüft
gelieferte Party-Angaben, keine externe Vergabe. Adresse oder GLN gehören in die
Vereinbarung, nicht verpflichtend zu jeder Party.
Siehe Vereinbarungsregeln und den
vollständigen Austausch-/PHP-Ablauf; dieser ist kein Java-API-Beispiel.
Datierte Historie abfragen
new VehicleHistory(instanceBundles) akzeptiert eine partiell graphgültige Liste
von Models.InstanceBundle. equipment(vehicleId, item, asOf) liefert
Codes.Presence, damageStatus(vehicleId, damageId, asOf) liefert
Codes.RepairStatus, component(vehicleId, component, asOf) liefert
Codes.ComponentGrade. Verwende ein echtes Datum im Format YYYY-MM-DD.
Fehlende datierte Belege bleiben UNKNOWN, kein Abwesenheitsnachweis. Ausbau beendet
ein halboffenes Intervall; widersprüchliche neueste gleichrangige Beobachtungen liefern
ebenfalls UNKNOWN. Undatierte Aussagen werden nicht rückdatiert.
Historieregeln erläutern die Auswertung.
Das SDK führt keine Datenbank-/Netzabfrage, Identitätsbestätigung, Rechnungsprüfung oder automatische Versionsmigration aus. Die Projektlizenz gewährt keine Rechte an Lieferantenexporten; Quelldatengrenzen gelten weiter.