Latest Avro compiler (1.8.2) generates java sources for dates logical types with Joda-Time based implementations. How can I configure Avro compiler to produce sources that u
You need to create your own Conversions to support java-8 date-time api, below is a conversion for java.time.LocalDate:
class Java8LocalDateConversion extends Conversion {
@Override
public Class getConvertedType() {
return LocalDate.class;
}
@Override
public String getLogicalTypeName() {
// v--- reuse the logical type `date`
return "date";
}
@Override
// convert LocalDate to Integer
public Integer toInt(LocalDate value, Schema schema, LogicalType type) {
return (int) value.toEpochDay();
}
@Override
// parse LocalDate from Integer
public LocalDate fromInt(Integer value, Schema schema, LogicalType type) {
return LocalDate.ofEpochDay(value);
}
}
The logical types can be reused in avro, so you can using the existing date logical type, for example:
Schema schema = LogicalTypes.date().addToSchema(Schema.create(Type.INT));
For the serializing & deserializing you should set the GenericData which will find your own conversion, for example:
//serializing
DatumWriter out = new SpecificDatumWriter<>(schema, data());
// deserializing
DatumReader in = new SpecificDatumReader<>(schema, schema, data());
private SpecificData data() {
SpecificData it = new SpecificData();
it.addLogicalTypeConversion(new Java8LocalDateConversion());
return it;
}
If you don't want to configure the GenericData every time, you can use the global GenericData instead, for example:
// register the conversion globally ---v
SpecificData.get().addLogicalTypeConversion(new Java8LocalDateConversion());