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/0/jpa/2.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
Apache kafka Kafka自定义反序列化程序转换为Java对象_Apache Kafka_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Apache kafka Kafka自定义反序列化程序转换为Java对象

Apache kafka Kafka自定义反序列化程序转换为Java对象,apache-kafka,kafka-consumer-api,spring-kafka,Apache Kafka,Kafka Consumer Api,Spring Kafka,我使用的是SpringKafka集成,我有自己的值GenericSerializer/deserializer,如下所示 序列化程序: 公共类KafkaSerializer实现序列化程序{ 私有对象映射器映射器; @凌驾 公众假期结束(){ } @凌驾 public void configure(最终映射设置、最终布尔值isKey){ 映射器=新的ObjectMapper(); } @凌驾 公共字节[]序列化(最终字符串主题,最终T对象){ 试一试{ 返回mapper.writeValueAsB

我使用的是SpringKafka集成,我有自己的值GenericSerializer/deserializer,如下所示

序列化程序:

公共类KafkaSerializer实现序列化程序{
私有对象映射器映射器;
@凌驾
公众假期结束(){
}
@凌驾
public void configure(最终映射设置、最终布尔值isKey){
映射器=新的ObjectMapper();
}
@凌驾
公共字节[]序列化(最终字符串主题,最终T对象){
试一试{
返回mapper.writeValueAsBytes(对象);
}捕获(最终JsonProcessingException e){
抛出新的IllegalArgumentException(e);
}
}
}
反序列化程序:

公共类KafkaDeserializer实现反序列化程序{
私有对象映射器映射器;
@凌驾
公众假期结束(){
}
@凌驾
public void configure(最终映射设置、最终布尔值isKey){
映射器=新的ObjectMapper();
}
@凌驾
公共T反序列化(最终字符串主题,最终字节[]字节){
试一试{
返回mapper.readValue(字节,新类型引用(){
});
}捕获(最终IOE例外){
抛出新的IllegalArgumentException(e);
}
}
}

序列化程序工作正常,但在使用消息时反序列化值时,我会得到一个
LinkedHashMap
,而不是所需的对象,请告知我哪里出错,提前感谢。

某些情况需要确认:

  • 您的
    序列化程序
    正常工作
  • 反序列化程序
    可以正常工作,但它返回的是一个
    LinkedHashMap
    ,而不是您期望的对象,对吗?您无法将该
    LinkedHashMap
    转换为您的
    对象
  • 我发现问题转移到如何将LinkedHashMap转换/强制转换为对象,您使用了
    ObjectMapper
    。如果所有情况都能得到证实,我发现这里有一个很好的帖子可以回答你的问题

    mapper.convertValue(desiredObject,new TypeReference(){})
    
    ObjectMapper
    的API位于[此处](,com.fasterxml.jackson.core.type.TypeReference))


    我希望我不会错过你的意图,你可以补充必要的情况,这样某人或我可以改进这个答案

    感谢您的回复,但是我的序列化程序工作起来很好,可以将我的对象转换为(JSON)字节,是的,反序列化程序正在将我的对象转换为LinkedHashMap,这应该是所需的对象,如果我需要将LinkedHashMap转换为所需的对象,那么使用自定义反序列化程序有什么意义,我可以使用StringDeserializer并使用ObjectMapper
    mapper将获得的JSON(作为字符串)转换为所需的对象。convertValue(desiredObject,new TypeReference(){})是否有效?是的,有效,但这是用户收到消息后需要的手动步骤,理想情况下,消费者应该获得所需的对象,在我的情况下,这是用户对象,而不是LinkedHashMap的对象。现在,我知道你想将用户对象转移到下游,好吗。前一个
    code
    完成了你的工作吗?我认为前一个代码是解决这个问题的一个变通方法。Spring Kafka已经提供了将JSON转换为Java对象的类。@ChinHuang,谢谢你的回复,但我需要一个通用的使用者,我猜JsonDeserializer构造函数采用了应该解析响应的类类型,那么,我如何利用它呢?@阿波罗——你是如何解决这个泛型消费者的问题的?@ Mubin,实际上我遵循非常天真的方法,我使用String RetrialAlgisher从主题中获取消息作为字符串,然后转换为所需的对象,但是,你可以考虑AVRO的相同(我后来遇到的)感谢的信息@阿波罗。
    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);
        }
      }
    }
    
    mapper.convertValue(desiredObject, new TypeReference<type-of-desiredObject>() { })