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

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

 

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); } }

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

当出现 `MapstructUtils.convert` 编译报错,提示找不到从 `TLogisticsInfoBo` 到 `TLogisticsInfo` 的转换器时,可以从以下几个方面解决: ### 1. 检查 MapStruct 配置 确保项目中已经正确配置了 MapStruct 依赖。以 Maven 为例,需要在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.3.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.3.Final</version> <scope>provided</scope> </dependency> ``` ### 2. 创建映射器接口 需要创建一个 MapStruct 映射器接口,用于定义从 `TLogisticsInfoBo` 到 `TLogisticsInfo` 的转换规则。示例如下: ```java import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @Mapper public interface LogisticsInfoMapper { LogisticsInfoMapper INSTANCE = Mappers.getMapper(LogisticsInfoMapper.class); TLogisticsInfo toLogisticsInfo(TLogisticsInfoBo bo); } ``` ### 3. 修改 `MapstructUtils.convert` 方法 确保 `MapstructUtils.convert` 方法能够正确调用映射器接口。示例如下: ```java public class MapstructUtils { public static <S, T> T convert(S source, Class<T> targetClass) { if (source == null) { return null; } if (source instanceof TLogisticsInfoBo && targetClass == TLogisticsInfo.class) { return (T) LogisticsInfoMapper.INSTANCE.toLogisticsInfo((TLogisticsInfoBo) source); } // 可以添加其他类型的转换逻辑 return null; } } ``` ### 4. 清理和重新构建项目 有时候,编译缓存可能会导致问题。可以尝试清理项目并重新构建,以确保生成最新的映射器实现类。 ### 5. 检查 IDE 配置 确保 IDE 正确配置了 MapStruct 注解处理器。以 IntelliJ IDEA 为例,需要在 `Settings` -> `Build, Execution, Deployment` -> `Compiler` -> `Annotation Processors` 中启用注解处理器。 ### 6. 检查类路径 确保 `TLogisticsInfoBo` 和 `TLogisticsInfo` 类在类路径中是可见的,没有出现类找不到的问题。 ### 7. 检查包名和类名 确保 `TLogisticsInfoBo` 和 `TLogisticsInfo` 的包名和类名在映射器接口和 `MapstructUtils` 中是正确的。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值