我可以拥有一个包含值作为枚举成员的枚举的 Avro 架构吗?
Can I have an Avro Schema with an enum that includes values as enum members?
这是我要转换为 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 字符串。所以,我认为问题更多的是关于序列化枚举。来自这里的参考 - https://www.baeldung.com/jackson-serialize-enums
如果你像这样使用 JsonFormat 注释,我认为它应该 return 代码 -
@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);
}
}
这是我要转换为 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 字符串。所以,我认为问题更多的是关于序列化枚举。来自这里的参考 - https://www.baeldung.com/jackson-serialize-enums
如果你像这样使用 JsonFormat 注释,我认为它应该 return 代码 -
@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);
}
}