1030. CustomSerde - dkkahm/study-kafka-with-spring GitHub Wiki
CustomJsonSerializer
public class CustomJsonSerializer<T> implements Serializer {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public byte[] serialize(String topic, Object data) {
try {
return objectMapper.writeValueAsBytes(data);
} catch (JsonProcessingException e) {
throw new SerializationException(e);
}
}
}
CustomJsonDeserializer
public class CustomJsonDeserializer<T> implements Deserializer<T> {
private ObjectMapper objectMapper = new ObjectMapper();
private final Class<T> deserializedClass;
public CustomJsonDeserializer(Class<T> deserializedClass) {
Objects.requireNonNull(deserializedClass, "Deserialized class must not null");
this.deserializedClass = deserializedClass;
}
@Override
public T deserialize(String s, byte[] bytes) {
try {
return objectMapper.readValue(bytes, deserializedClass);
} catch (IOException e) {
throw new SerializationException(e);
}
}
}
CustomJsonSerde
public class CustomJsonSerde<T> implements Serde {
private final CustomJsonSerializer<T> serializer;
private final CustomJsonDeserializer<T> deserializer;
public CustomJsonSerde(CustomJsonSerializer<T> serializer, CustomJsonDeserializer<T> deserializer) {
this.serializer = serializer;
this.deserializer = deserializer;
}
@Override
public Serializer<T> serializer() {
return this.serializer;
}
@Override
public Deserializer<T> deserializer() {
return this.deserializer;
}
}
PromotionSerde
public class PromotionSerde extends CustomJsonSerde<PromotionMessage> {
public PromotionSerde() {
super(new CustomJsonSerializer<>(), new CustomJsonDeserializer<>(PromotionMessage.class));
}
}
Topology
@Slf4j
@Configuration
public class PromotionUppercaseCustomJsonStream {
@Bean
public KStream<String, PromotionMessage> kstreamPromotionUppercase(StreamsBuilder builder) {
var stringSerde = Serdes.String();
var jsonSerde = new PromotionSerde();
KStream<String, PromotionMessage> sourceStream = builder.stream("t.commodity.promotion", Consumed.<String, PromotionMessage>with(stringSerde, jsonSerde));
KStream<String, PromotionMessage> uppercaseStream = sourceStream.mapValues(this::uppercasePromotionCode);
uppercaseStream.to("t.commodity.promotion.uppercase", Produced.with(stringSerde, jsonSerde));
sourceStream.print(Printed.<String, PromotionMessage>toSysOut().withLabel("Original Stream"));
uppercaseStream.print(Printed.<String, PromotionMessage>toSysOut().withLabel("Uppercase Stream"));
return sourceStream;
}
private PromotionMessage uppercasePromotionCode(PromotionMessage message) {
return new PromotionMessage(message.getPromotionCode().toUpperCase());
}
}