簡體   English   中英

我可以擁有一個 Avro 架構,其中的枚舉包含值作為枚舉成員嗎?

[英]Can I have an Avro Schema with an enum that includes values as enum members?

這是我想轉換為 Avro Schema 的 Java 枚舉:

public enum ApplicationCode {
    APP_A("MY-APP-A"),
    APP_B("MY-APP-B");


    private final String code;

    ApplicationCode(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }
}

由於枚舉通常可用作 Avro 中的類型,因此我提出了以下建議:

{
  "type" : "enum",
  "name" : "ApplicationCode",
  "namespace" : "com.example",
  "symbols" : [ "APP_A", "APP_B" ]
}

並在我的主要 Avro 中像這樣引用它:

"fields": [
    {
      "name": "masterApplicationCode",
      "type": "ApplicationCode"
    }, 

它就是這樣工作的,但不幸的是,我使用這種方法丟失了應用程序代碼(例如“MY-APP-A”)。 我正在尋找可以讓我同時包含代碼和 label 的東西。 就像是

{
  "type" : "enum",
  "name" : "ApplicationCode",
  "namespace" : "com.example",
  "symbols" : [ "APP_A("MY-APP-A")", "APP_B("MY-APP-B")" ]
}

是否有可能擁有這種復雜的枚舉,或者是否有任何解決方法來實現這一點?

我相信 avro 模式在內部將其轉換為 JSON 字符串。 所以,我認為問題更多是關於序列化枚舉。 從這里參考 - https://www.baeldung.com/jackson-serialize-enums

我認為如果您像這樣使用 JsonFormat 注釋,它應該返回代碼 -

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ApplicationCode {

否則,您將需要為枚舉添加自定義序列化程序。

我通過編寫自定義序列化器/反序列化器解決了我的問題,map 和 object 具有復雜的類型字段到一個使用例如字符串而不是枚舉發送的字段。

這是自定義序列化程序的示例:

public class CustomSerializer implements Serializer<ApplicationObject> {

    @Override
    public byte[] serialize(String topic, ApplicationObject ApplicationObjectDto) {
        com.example.avro.ApplicationObject applicationObject = com.example.avro.ApplicationObject.newBuilder()
                .setApplicationCode(ApplicationObjectDto.getApplicationCode().getCode())
                .build();
        return SerializationUtils.serialize(applicationObject);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM