【Cannot convert from [[B] to】 @RabbitListener 反序列化报错

本文详细解析了在SpringBoot2.0环境下整合RabbitMQ过程中遇到的问题,特别是在使用自定义对象进行消息传递时出现的转换错误。通过调整配置,如引入Jackson2JsonMessageConverter,成功解决了对象序列化和反序列化的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1.环境:springboot2.0
<!-- rabbitMq 引用包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
此服务生产端和消费端在同一个服务里,存储自定义对象没有问题,读取信息转成自定义对象报错。
2.报错信息
Endpoint handler details:
Method [public void com.xuexin.data.center.consumer.OrganMsgConsumer.process(com.xxxx.xxx.data.center.entity.EhrOrganInfo)]
Bean [com.xxxx.data.center.consumer.OrganMsgConsumer@20cd13d0]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:191)
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:126)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324)
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:817)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:801)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1042)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.xxx.xxxx.data.center.entity.EhrOrganInfo] for GenericMessage [payload=byte[190], headers={amqp_receivedDeliveryMode=PERSISTENT, amqp_receivedRoutingKey=MQ_EHR_ORGANS, amqp_contentEncoding=UTF-8, amqp_deliveryTag=1, amqp_consumerQueue=MQ_EHR_ORGANS, amqp_redelivered=false, id=f4ed04ef-18b4-8ad8-21a0-a0a7871cc11c, amqp_consumerTag=amq.ctag-KUOrbMAp9Cr-su_53T9NsQ, contentType=application/json, __TypeId__=com.xuexin.xcloud.data.center.entity.EhrOrganInfo, timestamp=1579069885047}]
    at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:144)
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:116)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:137)
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:109)
    at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:51)
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:188)
    ... 10 common frames omitted

3.解決方法:在RabbitConfig.java 中添加红色部分代码
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    @Value("${spring.rabbitmq.host}")
    private String addresses;
    @Value("${spring.rabbitmq.port}")
    private Integer port;
    @Value("${spring.rabbitmq.username}")
    private String username;
    @Value("${spring.rabbitmq.password}")
    private String password;
    public RabbitConfig() {
    }
    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses(this.addresses);
        connectionFactory.setPort(this.port);
        connectionFactory.setUsername(this.username);
        connectionFactory.setPassword(this.password);
        return connectionFactory;
    }
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }
    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(this.connectionFactory());
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }
    @Bean
    public Queue organQueue() {
        return new Queue("MQ_KEY");
    }
/** * 解决方法:添加这个类进行序列化解析 * 会自动识别 * @param objectMapper json序列化实现类 * @return mq 消息序列化工具 */ @Bean public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) { return new Jackson2JsonMessageConverter(objectMapper); } }

<think>好的,我需要帮助用户解决在Vue2中导入@antv/g6时出现的报错问题。首先,我应该回顾用户提供的引用信息,看看是否有相关的解决方案。 用户提到了三个引用:[^1]、[^2]、[^3]。引用提到在Vue3中使用5.x版本时出现错误,降级到4.8.21版本并按照4.x的写法解决了问题。这可能意味着版本兼容性是一个关键因素。因此,在Vue2中,可能也需要使用较旧的G6版本。 接下来,我需要考虑Vue2和G6的版本兼容性。用户可能在尝试使用较新的G6版本(比如5.x),而Vue2可能不兼容这些版本。根据引用的经验,降级到4.x版本可能有效。因此,建议用户检查当前安装的G6版本,并尝试降级到4.8.21。 另外,引用提到在Vue3中编译后出现多个DOM的问题,可能涉及组件的生命周期管理。虽然用户的问题是Vue2中的导入错误,但正确的初始化和销毁实例的方法可能有助于避免其他潜在问题。因此,在解决方案中应该包括正确创建和销毁G6实例的步骤,比如在mounted钩子中初始化,在beforeDestroy钩子中销毁实例。 用户可能没有正确导入G6库,或者使用了错误的语法。根据引用,正确的导入方式是`import G6 from '@antv/g6';`,需要确保用户在Vue2项目中正确安装了G6,并且导入语句没有错误。此外,检查打包工具(如webpack)的配置是否有问题,可能需要排除G6的某些依赖项。 另外,用户可能没有正确引入G6的样式文件。虽然引用中没有提到样式问题,但常见的错误可能包括忘记引入CSS文件,导致布局异常。因此,建议用户在main.js或组件中导入`@antv/g6/dist/g6.min.css`。 最后,需要考虑依赖冲突的可能性。如果项目中存在其他与G6冲突的库,可能需要调整依赖版本或配置。建议用户清理node_modules并重新安装依赖,确保版本一致性。 综合以上分析,解决方案应包括:检查并降级G6版本到4.x,正确导入和初始化G6实例,处理样式文件,管理组件生命周期,以及处理可能的依赖冲突。</think>### 解决方案:Vue2中导入@antv/g6报错处理步骤 #### 1. **版本兼容性问题** - **问题原因**:@antv/g6的5.x及以上版本可能对Vue2的构建环境存在兼容性问题(如ES Module解析差异、Webpack配置冲突等)。 - **解决方案**: 1. 卸载当前版本: ```bash npm uninstall @antv/g6 ``` 2. 安装兼容版本(推荐4.8.21): ```bash npm install @antv/g6@4.8.21 --save ``` #### 2. **正确初始化G6实例** - **代码示例**: ```javascript // 组件中导入 import G6 from '@antv/g6'; import '@antv/g6/dist/g6.min.css'; // 必须引入样式 export default { mounted() { this.initGraph(); }, beforeDestroy() { if (this.graph) { this.graph.destroy(); // 防止内存泄漏 } }, methods: { initGraph() { const container = this.$refs.graphContainer; // 确保模板中有<div ref="graphContainer"></div> this.graph = new G6.Graph({ container: container, width: 800, height: 500, modes: { default: ['drag-node'] } }); // 加载数据并渲染 this.graph.data({ nodes: [], edges: [] }); this.graph.render(); } } } ``` #### 3. **Webpack配置优化** - **问题场景**:若使用Vue CLI创建项目,需在`vue.config.js`中添加以下配置避免依赖解析错误: ```javascript module.exports = { configureWebpack: { externals: { // 防止某些依赖被错误打包 '@antv/g6': 'G6' // 若仍存在问题可尝试此配置 } } } ``` #### 4. **依赖冲突排查** - 若报错信息包含`Cannot assign to read only property 'exports'`等提示,可能是CommonJS与ES Module混合使用导致。需检查项目中其他库是否强制使用CommonJS模块,建议: ```bash npm update @antv/g6@4.8.21 --force ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值