最新的Avro编译器(1.8.2)为基于Joda-Time的实现生成dates logical types的java源代码。如何配置Avro编译器来生成使用Java 8日期时间API的源代码?Avro与Java 8的日期为逻辑类型
3
A
回答
1
目前(1.8.2的Avro),这是不可能的。生成乔达日期/时间类是硬编码的。
当前master
分支已经切换到Java 8并且有一个open issue(与Pull Request)添加与java.time.*
类型来生成类的能力。
不幸的是,我不知道任何目前在master
中的任何发布计划。如果您觉得冒险,您可以将修补程序应用于1.8.2
,因为理论上它应该都是兼容的。序列化/反序列化时的底层基类型仍然是整数和长整数。
0
您需要创建自己的Conversion s到支持java-8日期时API,下面是java.time.LocalDate
转换:
class Java8LocalDateConversion extends Conversion<LocalDate> {
@Override
public Class<LocalDate> 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);
}
}
的逻辑类型可以在Avro中被重复使用,这样你就可以使用现有date
逻辑类型,例如:
Schema schema = LogicalTypes.date().addToSchema(Schema.create(Type.INT));
对于序列化&反序列化,你应该设置GenericData
将找到自己的转换,例如:
//serializing
DatumWriter<T> out = new SpecificDatumWriter<>(schema, data());
// deserializing
DatumReader<T> in = new SpecificDatumReader<>(schema, schema, data());
private SpecificData data() {
SpecificData it = new SpecificData();
it.addLogicalTypeConversion(new Java8LocalDateConversion());
return it;
}
如果你不想每次都配置GenericData
,您可以使用全局GenericData
代替,例如:
// register the conversion globally ---v
SpecificData.get().addLogicalTypeConversion(new Java8LocalDateConversion());
相关问题
- 1. Avro 1.8.2 BigDecimal(逻辑类型)的Java代码生成
- 2. 条件IF与日期字段类型的逻辑
- 3. Java日历日期逻辑错误
- 4. Excel中的日期逻辑
- 5. 如何在Avro IDL中使用逻辑类型?
- 6. 如何将java日期类型存储为mysql日期类型?
- 7. [PHP]:逻辑与日期差异
- 8. 如果其他逻辑与空日期
- 9. 发布日期发票日期逻辑
- 10. Java 8日期API与日历/日期/日期格式
- 11. Java逻辑XOR(“^”)与逻辑NOT(“!”)
- 12. 与日期为编辑
- 13. 什么类型用于Java 8 bean日期属性 - Instant或ZoneDateTime?
- 14. 具有日期功能的逻辑
- 15. 有关日期在PHP中的逻辑
- 16. 截止到Cognos的日期逻辑
- 17. Jquery:条件类型逻辑
- 18. 将LocalTime(Java 8)转换为日期
- 19. java中的人性化日期逻辑函数库
- 20. 自定义开始日期和结束日期为一周的逻辑。 (c#)
- 21. 输入类型“日期”不可编辑
- 22. “截至日期”报告逻辑
- 23. Lenient Java 8日期解析
- 24. Avro tojson日期格式
- 25. 正确的OOP类逻辑的逻辑
- 26. 日期格式 - 逻辑错误
- 27. 将逻辑转换为使用Java 8流
- 28. 比较Java中的日期字符串形式与JDBC日期类型
- 29. 逻辑模型与域模型
- 30. 如何将Avro中的字节列(以十进制的逻辑类型)转换为十进制?
这里是我写在[github]上的测试(https://github.com/holi-java/api-tests/blob/6d09966f007bd6ea6089a5f638275ae0ff5b2a67/avro/src/test/java/test/avro/AvroTypesTest.java# L51_L55)。 –
它不能解决问题:avro编译器仍然为这种逻辑类型生成joda的日期字段。 – injecto