Исключение сериализации Avro - java.time.Instant не может быть приведено к java.lang.Long - PullRequest
0 голосов
/ 14 октября 2019

Я хочу отправить сообщение Kafka с полезной нагрузкой класса, который расширяется SpecificRecordBase ;это класс, который был сгенерирован с помощью плагина maven.

Одно из полей моей схемы имеет тип timestamp-millis, который соответствует java.time.Instant в сгенерированном классе. ,

Поле определяется следующим образом:

{"name": "processingTime", "type": {
   "type": "long",
   "logicalType": "timestamp-millis"
   }
},

Когда я создаю экземпляр этого класса и устанавливаю время обработки,

setProcessingTime(RandomDate.randomInstant())

все в порядке, нокогда я запускаю программу и пытаюсь отправить ее в Kafka, я получаю следующую ошибку:

org.apache.kafka.common.errors.SerializationException: Can't convert value of class poc.avroGenerated.AvroMeasurement to class poc.avroSerde.AvroSerializer specified in value.serializer
Caused by: java.lang.ClassCastException: class java.time.Instant cannot be cast to class java.lang.Long (java.time.Instant and java.lang.Long are in module java.base of loader 'bootstrap')

Вот мой собственный класс сериализатора:

@Override
public byte[] serialize(String topic, T data) {

    byte[] result = null;
    try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        BinaryEncoder binaryEncoder = EncoderFactory.get().binaryEncoder(byteArrayOutputStream, null);
        DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(data.getSchema());
        datumWriter.write(data, binaryEncoder);
        binaryEncoder.flush();
        byteArrayOutputStream.close();
        result = byteArrayOutputStream.toByteArray();
    } catch (IOException e) {
        LOGGER.error(e);
    }
    return result;
}

1 Ответ

0 голосов
/ 15 октября 2019

Используйте SpecificDatumWriter вместо GenericDatumWriter.

Вставьте это одно изменение, и ваш настраиваемый сериализатор выглядит отлично!

Это часто вызывает путаницу. В реализации Java «общие» данные не учитывают никаких настроек, встроенных в конкретную запись, включая преобразования логических типов.

...