[英]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.