【问题标题】:Make Kafka ignore object's deserialiser and use Kafka deserialiazer让Kafka忽略对象反序列化器并使用Kafka反序列化器
【发布时间】: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


【解决方案1】:

您正在创建自己的 ObjectMapper。如果要配置Spring-Kafka的ObjectMapper实例,那么see here

让我的 Kafka 停止使用自定义实现

如果您想使用 String Deserializer 而不是 JSON,则不需要 delegates。直接设置解串器就行了

spring:
  kafka:
    consumer:
      key-deserializer: com.apache.kafka.common.serialization.StringDeserializer
      value-deserializer:  ...

除此之外,不清楚为什么您实际上需要需要反序列化自己而不是使用实际的 Item 类的字符串

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 2020-07-06
    • 2021-10-21
    • 2019-11-18
    • 1970-01-01
    • 2017-12-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多