如何将LinkedHasMap转换为自定义对象?

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

我的 Kafka Consumer 端有 2 个主题。主题 A 和主题 B。两者都采用相同的方法。详细方法如下;

@Slf4j
@Service
public class KafkaConsumerService {

    @KafkaListener(topics = { "topic-a", "topic-b" }, groupId = "X-consumer")
    public <T> void listenX(Response<T> msg) {
        log.info("MSG arrived to consumer");
        KafkaMessageDTO<TokenMobieDTO> test = msg.getData();
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class KafkaMessageDTO<T> {

    @JsonProperty("object")
    private T object;

    @JsonProperty("header")
    private HttpHeaders headers;

}

我总是将 msg 变量类型为

KafkaMessageDTO<TokenMobieDTO>
发送到该方法。尝试从 KafkaMessageDTO 中提取对象(
kafkaMessageDTO.getObject()
),但不幸的是,我无法做到这一点。

在调试中,我能够看到这些值并且看起来数据完全匹配,如下所示

如何将 msg 对象转换为 KafkaMessageDTO 对象?当我尝试转换它时,我收到此错误

threw exception; nested exception is java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.token.dto.TokenMobieDTO (java.util.LinkedHashMap is in module java.base of loader 'bootstrap';

我尝试过映射,但就像数据不包含列表一样,我无法迭代。问题依然存在

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

您的代码中的问题与 Java 中的泛型类型擦除有关。当您尝试从 KafkaMessageDTO 中提取对象时,通用类型信息会因类型擦除而丢失,从而无法直接访问 TokenMobieDTO。

要解决此问题,您可以修改 KafkaConsumerService 类,将实际的类类型传递给listenX 方法。具体方法如下:

@Slf4j
@Service
public class KafkaConsumerService {

    @KafkaListener(topics = { "topic-a", "topic-b" }, groupId = "X-consumer")
    public <T> void listenX(KafkaMessageDTO<T> msg) {
        log.info("MSG arrived to consumer");
        T object = msg.getObject();
        // Use 'object' (e.g., cast it to TokenMobieDTO if needed)
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class KafkaMessageDTO<T> {

    @JsonProperty("object")
    private T object;

    @JsonProperty("header")
    private HttpHeaders headers;

    // Getter for 'object'
    public T getObject() {
        return object;
    }
}

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