我的 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 中的泛型类型擦除有关。当您尝试从 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;
}
}