Почему мой код Avro создается как интерфейс, а не как класс?

#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;  } }  

Обратите внимание, что имена протоколов и записей разные.