Class JsonSchemaSerde<T>
- Type Parameters:
T- the Jackson-compatible type carried by the serde
- All Implemented Interfaces:
Closeable, AutoCloseable, org.apache.kafka.common.serialization.Serde<T>
Values are bound to and from JSON with Jackson, so any Jackson-compatible class
works, including Java records. Optional validation checks the serialized document
against the local schema when writing and against the registered writer schema when
reading; a validation failure throws SerializationException.
The schema dialect is detected from the document's $schema keyword and
falls back to draft 2020-12; pass an explicit
SpecificationVersion through the long factory overloads to pin it.
Example
record Order(String user, long amount) {}
String orderSchema = """
{"type": "object",
"properties": {"user": {"type": "string"}, "amount": {"type": "integer"}},
"required": ["user", "amount"]}""";
var serde = JsonSchemaSerde.forValue(Order.class, orderSchema, cache, true);
serde.registerSubject("orders");
cache.prewarm().join();
byte[] bytes = serde.serializer().serialize("orders", new Order("ada", 7));
-
Method Summary
Modifier and TypeMethodDescriptionprotected final SchemaCachecache()Returns the schema cache this serde resolves subjects and writer schemas with.protected TdeserializeBody(int schemaId, byte[] body) Decodes one body into a value using the writer schema registered under the ID.final org.apache.kafka.common.serialization.Deserializer<T> Returns the deserializer half of this serde.static <T> JsonSchemaSerde<T> forKey(Class<T> type, String schema, SchemaCache cache, boolean validate) Creates a key serde with a default Jackson mapper.static <T> JsonSchemaSerde<T> forKey(Class<T> type, String schema, SchemaCache cache, boolean validate, com.networknt.schema.SpecificationVersion dialect, SubjectNameStrategy strategy, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a fully configured key serde.static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate) Creates a value serde with a default Jackson mapper.static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a value serde with a caller-supplied Jackson mapper.static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate, com.networknt.schema.SpecificationVersion dialect, SubjectNameStrategy strategy, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a fully configured value serde.protected byte[]frame(int schemaId, byte[] body) Wraps body bytes in the Confluent wire format.final voidregisterSubject(String topic) Adds this serde's subject to the cache prewarm set.protected byte[]serializeBody(T value) Encodes one value into the schema-format-specific body bytes, without framing.final org.apache.kafka.common.serialization.Serializer<T> Returns the serializer half of this serde.protected ConfluentWireFormat.Frameunframe(byte[] bytes) Splits framed record bytes into the schema ID and body.Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.apache.kafka.common.serialization.Serde
close, configure
-
Method Details
-
forValue
public static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate) Creates a value serde with a default Jackson mapper.- Type Parameters:
T- the Jackson-compatible value type- Parameters:
type- the class values are bound to and fromschema- the JSON Schema document registered for the subjectcache- the cache that resolves subjects and writer schemasvalidate- whether to validate documents on both serialize and deserialize- Returns:
- a value serde for
type - Throws:
IllegalArgumentException- ifschemais not valid JSON
-
forKey
public static <T> JsonSchemaSerde<T> forKey(Class<T> type, String schema, SchemaCache cache, boolean validate) Creates a key serde with a default Jackson mapper.- Type Parameters:
T- the Jackson-compatible key type- Parameters:
type- the class keys are bound to and fromschema- the JSON Schema document registered for the subjectcache- the cache that resolves subjects and writer schemasvalidate- whether to validate documents on both serialize and deserialize- Returns:
- a key serde for
type - Throws:
IllegalArgumentException- ifschemais not valid JSON
-
forValue
public static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a value serde with a caller-supplied Jackson mapper.- Type Parameters:
T- the Jackson-compatible value type- Parameters:
type- the class values are bound to and fromschema- the JSON Schema document registered for the subjectcache- the cache that resolves subjects and writer schemasvalidate- whether to validate documents on both serialize and deserializeobjectMapper- the mapper used for binding and validation input- Returns:
- a value serde for
type - Throws:
IllegalArgumentException- ifschemais not valid JSON
-
forValue
public static <T> JsonSchemaSerde<T> forValue(Class<T> type, String schema, SchemaCache cache, boolean validate, com.networknt.schema.SpecificationVersion dialect, SubjectNameStrategy strategy, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a fully configured value serde.- Type Parameters:
T- the Jackson-compatible value type- Parameters:
type- the class values are bound to and fromschema- the JSON Schema document registered for the subjectcache- the cache that resolves subjects and writer schemasvalidate- whether to validate documents on both serialize and deserializedialect- the JSON Schema dialect, or null to detect it from the documentstrategy- the subject naming strategy, or null for the cache defaultobjectMapper- the mapper used for binding and validation input- Returns:
- a value serde for
type - Throws:
IllegalArgumentException- ifschemais not valid JSON
-
forKey
public static <T> JsonSchemaSerde<T> forKey(Class<T> type, String schema, SchemaCache cache, boolean validate, com.networknt.schema.SpecificationVersion dialect, SubjectNameStrategy strategy, com.fasterxml.jackson.databind.ObjectMapper objectMapper) Creates a fully configured key serde.- Type Parameters:
T- the Jackson-compatible key type- Parameters:
type- the class keys are bound to and fromschema- the JSON Schema document registered for the subjectcache- the cache that resolves subjects and writer schemasvalidate- whether to validate documents on both serialize and deserializedialect- the JSON Schema dialect, or null to detect it from the documentstrategy- the subject naming strategy, or null for the cache defaultobjectMapper- the mapper used for binding and validation input- Returns:
- a key serde for
type - Throws:
IllegalArgumentException- ifschemais not valid JSON
-
serializeBody
-
deserializeBody
Decodes one body into a value using the writer schema registered under the ID.- Parameters:
schemaId- the schema ID taken from the frame headerbody- the body bytes that followed the frame header- Returns:
- the decoded value
- Throws:
Exception- if the body cannot be decoded
-
registerSubject
Adds this serde's subject to the cache prewarm set.Call this once per topic the serde will read or write, then resolve every registered subject with
SchemaCache.prewarm()before the first record is serialized. Registration is idempotent by subject.- Parameters:
topic- the Kafka topic whose subject should be resolved during prewarm
-
cache
Returns the schema cache this serde resolves subjects and writer schemas with.- Returns:
- the schema cache supplied at construction
-
serializer
Returns the serializer half of this serde.The serializer frames each non-null value with the Confluent wire format using the schema ID resolved during prewarm. It throws
SerializationExceptionwhen the subject has not been resolved yet or when the body cannot be encoded. A null value serializes to null.- Specified by:
serializerin interfaceorg.apache.kafka.common.serialization.Serde<T>- Returns:
- the reusable, thread-safe serializer
-
deserializer
Returns the deserializer half of this serde.The deserializer unframes the Confluent header, resolves the writer schema for the frame's schema ID through the cache, and decodes the body. It throws
SchemaFetchPendingExceptionwhile an unknown writer schema is being fetched andSerializationExceptionfor malformed input. Null input deserializes to null.- Specified by:
deserializerin interfaceorg.apache.kafka.common.serialization.Serde<T>- Returns:
- the reusable, thread-safe deserializer
-
frame
protected byte[] frame(int schemaId, byte[] body) Wraps body bytes in the Confluent wire format.- Parameters:
schemaId- the resolved schema ID for the subjectbody- the encoded body- Returns:
- the framed record bytes
-
unframe
Splits framed record bytes into the schema ID and body.- Parameters:
bytes- the framed record bytes- Returns:
- the decoded frame
-