#java #avro
#Ява #авро
Вопрос:
Я не могу вызвать метод newBuilder() в своем классе, созданном Avro.
return (data -gt; { return Flux.fromIterable(data) .map(sampleRecord -gt; SampleRecord.newBuilder() // FAIL - avro supplied newBuilder() method not found .setId(1) .setDescription("desc") .setValue(42) .build()) .collectList(); });
Когда я смотрю на фактический сгенерированный код, я вижу, что сгенерированный класс фактически определен как интерфейс (!!), а не класс, который затем определил бы newBuilder().
Я уверен, что мой код .avdl действителен!
@namespace("com.example") protocol SampleRecord { record SampleRecord { string id; string description; string value; } }
Почему он генерирует интерфейс SampleRecord, а не класс?!
Ответ №1:
Протокол и имя записи (имя потенциального класса) совпадают. Это (по какой-то причине) указывает синтаксическому анализатору *.avdl, что запись должна выводиться в виде интерфейса. Переименуйте протокол, чтобы он был уникальным. Затем запись будет сгенерирована как класс.
@namespace("com.example") protocol SampleRecordProtocol { record SampleRecord { string id; string description; string value; } }
Обратите внимание, что имена протоколов и записей разные.