Avro架构生成 - 对象重新排序

时间:2017-11-02 17:24:47

标签: avro jackson-dataformat-avro

我需要从现有Java模型生成AVRO模式。然后我想使用该模式生成Java对象,这样我就可以用生成的模型替换现有模型,使模式成为事实的来源。

我遇到了一个问题,我将尝试用这个例子说明。

我有一个基本的Java类:

public class Car {

private String price;
private String engine;

public Car(String price, String engine) {
    this.price = price;
    this.engine = engine;
}

public String getPrice() {
    return price;
}

public void setPrice(String price) {
    this.price = price;
}

public String getEngine() {
    return engine;
}

public void setEngine(String engine) {
    this.engine = engine;
}
}

我想生成一个代表此类的avro架构。

public static void main(String[] args) throws JsonMappingException {
    System.out.println(generateAvroSchema());
}

public static String generateAvroSchema() throws JsonMappingException {
    ObjectMapper mapper = new ObjectMapper(new AvroFactory());
    AvroSchemaGenerator gen = new AvroSchemaGenerator();
    mapper.acceptJsonFormatVisitor(Car.class, gen);
    Schema schema = gen.getGeneratedSchema().getAvroSchema();
    return schema.toString(true);
}

结果是:

{
  "type" : "record",
  "name" : "Car",
  "namespace" : "app",
  "fields" : [ {
    "name" : "engine",
    "type" : [ "null", "string" ]
  }, {
    "name" : "price",
    "type" : [ "null", "string" ]
  } ]
}

生成架构时,对象属性按字母顺序排序。如果我要使用此模式生成新的Java模型,则构造函数参数排序将与源不同。

我的问题是,在生成架构以保留属性排序时是否可以使用任何配置而不是默认为按字母顺序排列?

由于

1 个答案:

答案 0 :(得分:0)

也进入这个问题,解决了https://github.com/fasterxml/jackson-dataformat-csv/issues/40

之后的问题

基本上在mapper上调用mapper.disable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);