![](/img/trans.png)
[英]java.lang.ClassCastException: Cannot cast java.util.LinkedHashMap to Specific class
[英]How to fix 'java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class' error?
我正在使用 Java 开发一个 Spring 项目,该项目接收来自 Google Pub/Sub 订阅的消息。 但是,我的代码无法解析这些传入的消息。 消息以 JSON 格式给出。 示例消息如下:
{
"crudType": "Create",
"payload": {
"id": 14833,
"product": { "id": 14829, "name": "Product18" },
"color": { "id": 4, "name": "Green" },
"name": "Option 4"
}
}
我的消息使用者方法尝试将消息解析为名为CrudEvent
的兼容类,该类包含ProductOption
实体。 这些类的属性与入站 JSON 消息的格式相匹配。 我也尝试使用 DTO,但没有成功。
@ServiceActivator(inputChannel = Channels.PRODUCT_OPTION_INPUT)
public void handleProductOptionMessage(Message<CrudEvent<ProductOption>> message) throws Exception {
try {
// LoggerFactory.getLogger(Consumer.class).info(message.toString());
CrudEvent<ProductOption> event = message.getPayload();
LoggerFactory.getLogger(Consumer.class).info(event.toString());
ProductOption productOption = event.getPayload();
this.logger.info(productOption.toString());
// this.handleEvent(this.productOptionService, event, productOption);
this.ack(message);
} catch (Exception e) {
this.logger.error("Failed to handle product option message!");
throw e;
}
}
我的 ProductOption 实体编码如下:
package nl.omoda.stocktestservice.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import nl.omoda.stocktestservice.messaging.dto.ProductOptionDto;
@Entity
public class ProductOption {
@Id
private Long id;
@ManyToOne()
@JoinColumn(name = "productId")
private Product product;
private String name;
protected ProductOption() {}
public ProductOption(Long id, Product product, String name) {
this.id = id;
this.product = product;
this.name = name;
}
public ProductOption(ProductOptionDto dto) {
this(dto.getId(), new Product(dto.getProduct()), dto.getName());
}
@Override
public String toString() {
return "{" +
" id='" + getId() + "'" +
", product='" + getProduct() + "'" +
", name='" + getName() + "'" +
"}";
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public Product getProduct() {
return this.product;
}
public void setProduct(Product product) {
this.product = product;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Product 实体几乎相同,只是它只有“id”和“name”属性。 JSON 中的颜色字段未在 ProductOption 实体中使用。
完整的错误日志:
org.springframework.messaging.MessageHandlingException:
error occurred during processing message in 'MethodInvokingMessageProcessor' [org.springframework.integration.handler.MethodInvokingMessageProcessor@6927b9b0];
nested exception is java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class nl.omoda.stocktestservice.entity.Product
(java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; nl.omoda.stocktestservice.entity.Product is in unnamed module of loader 'app')
Spring 似乎不支持类型包含泛型的 Message。 将 CrudEvent 类型复制为预先插入 ProductOptions 的版本修复了错误(我将其命名为 ProductOptionCrudEvent)。
消息接收不支持泛型有点奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.