【发布时间】:2022-01-17 14:02:54
【问题描述】:
我有一个场景,我自定义实现了我的类 Item extends JsonDeserializer<User> 的反序列化,它以一种方式反序列化我的对象。
虽然 Kafka 使用 org.springframework.kafka.support.serializer.JsonDeserializer,但我的新实现将覆盖它。
如何让我的 Kafka 停止使用自定义实现?
自定义实现代码
public class ItemDeserializer extends JsonDeserializer<Item> {
public ItemDeserializer() {
this(null);
}
public ItemDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Item deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
int id = (Integer) ((IntNode) node.get("id")).numberValue();
String itemName = node.get("itemName").asText();
int userId = (Integer) ((IntNode) node.get("createdBy")).numberValue();
return new Item(id, itemName, new User(userId, null));
}}
在使用自定义反序列化器时,我称之为
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Item.class, new ItemDeserializer());
mapper.registerModule(module);
Item readValue = mapper.readValue(json, Item.class);
Item 类被注释
@JsonDeserialize(using = ItemDeserializer.class)
public class Item {
public int id;
public String itemName;
public User owner;
}
卡夫卡配置
consumer:
deserializer:
key.delegate.class: com.apache.kafka.common.serialization.stringDeserializer
value.delegate.class: com.apache.kafka.common.serialization.JsonDeserializer
json:
trusted:
packages: com.package.to.item
尝试搜索 3 天。这是我解决这个问题的最后手段
【问题讨论】:
-
你到底是什么意思覆盖?你看到了什么和你期望什么?您已经制作并配置了一个新的 ObjectMapper。这不应该干扰 Deserializer 自己的 ObjectMapper。您必须显示您的 Kafka 客户端属性
-
这些是我的 Kafka 配置。
-
@OneCricketeer,谢谢,已更正。
-
stringDeserializer也不正确...您没有从代码中完全复制这些吗?而且,您已经定义了委托,但是您的实际反序列化器设置在哪里定义?你还没有回答我关于你想要什么和你得到什么的问题 -
发生了什么:Kafka stringDeserializer 没有被调用。相反,我的 ItemDeserializer.class 正在被调用。
标签: java json apache-kafka spring-kafka