Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以拥有一个包含值作为枚举成员的枚举的Avro架构吗?_Java_Apache Kafka_Enums_Avro - Fatal编程技术网

Java 我可以拥有一个包含值作为枚举成员的枚举的Avro架构吗?

Java 我可以拥有一个包含值作为枚举成员的枚举的Avro架构吗?,java,apache-kafka,enums,avro,Java,Apache Kafka,Enums,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() {

这是我想要转换为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")" ]
}

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

我相信avro模式在内部将其转换为JSON字符串。所以,我认为问题更多的是序列化枚举。此处的参考-

我认为如果像这样使用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);
    }
}
公共类CustomSerializer实现序列化程序{
@凌驾
公共字节[]序列化(字符串主题,ApplicationObject ApplicationObject DTO){
com.example.avro.ApplicationObject ApplicationObject=com.example.avro.ApplicationObject.newBuilder()
.setApplicationCode(ApplicationObjectDto.getApplicationCode().getCode())
.build();
返回SerializationUtils.serialize(applicationObject);
}
}

您是否尝试在枚举中重写toString方法?类似super.toString()+”(“+code+”)“如何在Avro文件中重写toString()方法@SKumarI生成了这样的avroSchema,并按照您的建议使用了toString覆盖:
Schema avroSchema=ReflectData.get().getSchema(ApplicationCode.class);打印(avroSchema.toString(true))但模式仍然是这样的:
{“type”:“enum”,“name”:“ApplicationCode”,“namespace”:“com.example”,“symbols”:[“APP_A”,“APP_B”]}
Thx对于上面的示例,它启发我编写自定义序列化程序/反序列化程序@SKumar