我是否可以使用带有包含作为枚举成员值的枚举的Avro模式?

问题描述

这是我要转换为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","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 {

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

,

我通过编写自定义序列化器/反序列化器解决了我的问题,该序列化器/解串器将具有复杂类型字段的对象映射到正在发送的对象,例如字符串而不是枚举。

以下是自定义序列化程序的示例:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...