Kafka 自定义反序列化器转换为 Java 对象

问题描述 投票:0回答:1

我正在使用 Spring Kafka 集成,我有自己的值通用序列化器/反序列化器,如下所示

序列化器:

public class KafkaSerializer<T> implements Serializer<T> {

  private ObjectMapper mapper;

  @Override
  public void close() {
  }

  @Override
  public void configure(final Map<String, ?> settings, final boolean isKey) {
    mapper = new ObjectMapper();
  }

  @Override
  public byte[] serialize(final String topic, final T object) {
    try {
      return mapper.writeValueAsBytes(object);
    } catch (final JsonProcessingException e) {
      throw new IllegalArgumentException(e);
    }
  }
}

解串器:

public class KafkaDeserializer<T> implements Deserializer<T> {

  private ObjectMapper mapper;

  @Override
  public void close() {
  }

  @Override
  public void configure(final Map<String, ?> settings, final boolean isKey) {
    mapper = new ObjectMapper();
  }

  @Override
  public T deserialize(final String topic, final byte[] bytes) {
    try {
      return mapper.readValue(bytes, new TypeReference<T>() {
      });
    } catch (final IOException e) {
      throw new IllegalArgumentException(e);
    }
  }
}

序列化器工作正常,但是当涉及到消费消息时值的反序列化时,我得到一个

LinkedHashMap
而不是所需的对象,请告诉我我错在哪里,提前谢谢。

apache-kafka kafka-consumer-api spring-kafka
1个回答
0
投票

有些情况需要确认:

  1. 你的
    Serializer
    是作品
  2. Deserializer
    只是有效,但它返回了一个
    LinkedHashMap
    而不是您期望的对象,对吗?并且您无法将
    LinkedHashMap
    转换为您的
    object
    .

我发现问题转移到How to Convert/Cast a LinkedHashMap to a Object,而您使用了

ObjectMapper
。如果所有情况都可以确认,我在这里找到了一个很好的帖子可能会回答你的问题Casting LinkedHashMap to Complex Object

mapper.convertValue(desiredObject, new TypeReference<type-of-desiredObject>() { })

ObjectMapper
的 API 在 [此处](https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/ObjectMapper.html#convertValue(java.lang .Object, com.fasterxml.jackson.core.type.TypeReference))

我希望我没有错过你的意图,你可以补充必要的情况,以便有人或我可以改进这个答案。

© www.soinside.com 2019 - 2024. All rights reserved.