1

我需要从现有的 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 模型,构造函数参数的顺序将与源不同。

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

谢谢

4

1 回答 1

0

也遇到了这个问题,按照https://github.com/fasterxml/jackson-dataformat-csv/issues/40解决了

基本上调用mapper.disable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);映射器。

于 2018-04-26T18:34:35.113 回答