Zum Hauptinhalt springen

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:

WertBedeutung 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:

BindungErwarteter Wert
contract_id, contract_versionVereinbarung und unveränderliche Revision
publisher_party_id, consumer_party_idLieferant und empfangendes Autohaus, gerichtet
profile, cmd_versionVereinbartes 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.