簡體   English   中英

如何修復“java.lang.ClassCastException:類 java.util.LinkedHashMap 無法轉換為類”錯誤?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM