繁体   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