我可以有一个带有枚举的avro模式,其中包含作为枚举成员的值吗?

tcomlyy6  于 2021-06-04  发布在  Kafka
关注(0)|答案(2)|浏览(498)

这是我要转换为avro模式的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”)。我在寻找一些东西,它允许我同时包含代码和标签。像这样的

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

有没有可能有这种复杂的枚举,或者有什么解决方法来实现这一点?

p8h8hvxi

p8h8hvxi1#

我通过编写自定义序列化程序/反序列化程序解决了这个问题,该程序将具有复杂类型字段的对象Map到使用字符串而不是枚举发送的对象。
下面是自定义序列化程序的示例:

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);
    }
}
4zcjmb1e

4zcjmb1e2#

我相信avro模式在内部将其转换为json字符串。所以,我认为问题更多的是序列化枚举。此处引用-https://www.baeldung.com/jackson-serialize-enums
我认为如果您使用这样的jsonformat注解,它应该返回代码-

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

否则,需要为枚举添加自定义序列化程序。

相关问题