当前位置: 首页 > 知识库问答 >
问题:

将Kafka有效载荷转换为对象

范轶
2023-03-14

有效负载:{“post”:{“postid”:“5e22fac7f7356803e8784172”,“tags”:[“a”,“lovve”,“asldkjfsbajfdkjlnzx”,“z”]},“date”:“2020-01-18t16:12:50.833423”,“user”:{“userid”:“5dfcfd77367c690edd91b2d9”},“reactiontype”:“unreoved”}

我在Kafka中有这样的配置

@Bean
public Map<String, Object> consumerConfigs() {
    Map<String, Object> props = new HashMap<>(
            kafkaProperties.buildConsumerProperties());

    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
            StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
            JsonDeserializer.class);
    props.put(ConsumerConfig.GROUP_ID_CONFIG,
            "magpie-trending");
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

    return props;
}

我有一个类,有相同的有效负载代码,我如何在任何时候在对象中转换它?

大家好,我有一个微服务接收这个字符串并且正在工作,但是我需要将这个字符串转换为一个特定的对象,当我使用ObjectMapper转换应用程序时,会返回这个异常:

抛出异常;嵌套异常是com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造com.avenuecode.magpie.trending.component.kafka.message.PostMessage的实例(没有像默认构造一样的创建者存在):无法从对象值反序列化(没有基于委托或属性的创建者)

所以我的目标是:

public class ReactionMessage {
 private PostMessage post;
 private String date;
 private UserMessage user;
 private String reactionType;

 @JsonCreator
 public ReactionMessage(@JsonProperty("post") PostMessage post,
                       @JsonProperty("user") UserMessage user,
                       @JsonProperty("date") String date,
                       @JsonProperty("reactionType") String reactionType) {
    this.post = post;
    this.date = date;
    this.user = user;
    this.reactionType = reactionType;
 }

 @JsonCreator
 public ReactionMessage() {
 }
}
  @KafkaListener(topics = "reaction-topic", clientIdPrefix = "string", groupId = "magpie-trending")
  public void listenAsObject(ConsumerRecord<String, String> cr,
                           @Payload String payload) throws IOException {
    logger.info("Logger 1 [JSON] received key {}: Type [{}] | Payload: {} | Record: {}", cr.key(),
            typeIdHeader(cr.headers()), payload, cr.toString());

    ObjectMapper mapper = new ObjectMapper();
    ReactionMessage message = mapper.readValue(payload, ReactionMessage.class);

}

   private static String typeIdHeader(Headers headers) {
    return StreamSupport.stream(headers.spliterator(), false)
            .filter(header -> header.key().equals("__TypeId__"))
            .findFirst().map(header -> new String(header.value())).orElse("N/A");
}

共有1个答案

杜俊远
2023-03-14

您需要使JSONDeserializer返回您期望的对象类型

例如,Kafka内置的JSON反序列化器只返回jsonnode

Spring JSON反序列化器有额外的属性来传递类名

 类似资料:
  • 我试图写一个规范来使用jolt转换完成下面的转换。我需要将平面JSON转换成嵌套JSON。 输入数据: 我在将平面JSON转换为嵌套JSON时遇到了一些问题。这里,我希望基于stoptype属性聚合数据,并且需要针对唯一的有效负载进行聚合。我用https://jolt-demo.appspot.com来测试以下内容。 输出: 你能帮我完成这个预期的输出吗?

  • 当安装了Veil,我们可以查看它的命令。这些命令很简单,如下面的屏幕截图所示。例如:命令用于退出程序,用于提供有关特定工具的信息,用于列出可用工具,用于更新Veil,启用任何工具的使用,如在给定的屏幕截图中显示: 在上面的屏幕截图中,我们可以看到Veil中使用了两种类型的工具: :此工具用于生成无法检测到的后门。 :此工具用于生成Evasion使用的有效负载,它更像是一种辅助工具。 有效负载是代码

  • 我已经应用了一个使用snmp4j发送和接收陷阱的示例,一切都很好。 但问题是: 当使用mule esb接收snmp陷阱时,我无法将传入的消息有效负载转换为PDU(或任何snmp4j合适的对象)以从中提取数据,我已经做了很多搜索,但徒劳无功。 有人能帮助我: 将我从udpendpoint收到的mule esb消息有效负载转换为org.snmp4j。从PDU对象中提取陷阱数据吗? 这是我的代码:

  • 问题内容: 我试图从一个对象。该字符串包含一些字符,需要用其百分比转义序列替换。但是,当我使用URLEncoder以UTF-8编码对String进行编码时,即使将/替换为其转义序列。 如何从String对象获取有效的编码URL? http://www.google.com?q=a b给出 **http%3A%2F%2www.google.com …, 而我希望输出为 http://www.goog

  • Kafka MQ源连接器可以将事件从MQ带到1个Kafka主题,我们可以在Kafka MQ连接器内部进行基于消息的路由吗? 还是我们必须编写一个KStream应用程序来根据内容负载进行路由

  • 问题内容: 我正在尝试使用具有JSON有效负载的POST请求从REST API获取JSON响应(在发送前应转换为URL编码的文本)。我已经按照一些教程实施了该过程,但是状态代码为400,但出现错误。我可能未在编码给定的JSON字符串或缺少某些内容。请帮我解决这个问题。谢谢。 这是我的代码 问题答案: 在跟踪了许多帖子和教程超过24小时后,我知道我没有正确发送URL参数。而且我还了解到使用 Apac