自考网页制作与网站建设,学室内设计好不好,做一个网页容易吗,seo推广手段目录
1. 报错的背景
2. 问题分析
3. 最佳解决办法 1. 报错的背景
a#xff09;使用 RabbitMQ 发送消息时#xff0c;发送消息的类型为 MapString, Object#xff0c;map 里面我 put 了一个 String, Long 类型#xff0c;如下图#xff1a; b#xff…目录
1. 报错的背景
2. 问题分析
3. 最佳解决办法 1. 报错的背景
a使用 RabbitMQ 发送消息时发送消息的类型为 MapString, Objectmap 里面我 put 了一个 String, Long 类型如下图 b这里有一个前提我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时消息的序列化是由 MessageConverter 完成的。默认情况下RabbitTemplate 使用 SimpleMessageConverter它只能处理简单的消息类型如整形、字符串、字节数组等如果一旦是类似于 map 这种复杂结构则需要配置一个适当的 MessageConverter 来序列化和反序列化这些对象。
因此这里我使用 Jackson 库将对象序列化为 JSON 格式如下消息转化器配置 dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencyConfiguration
public class MqConfig {/*** 消息转化器* return*/Beanpublic MessageConverter jsonMessageConverter() {return new Jackson2JsonMessageConverter();}}c拿到发来的消息 map 后将消息按照传入的类型进行强制类型转化 但是在强制类型转化 Long 的时候出现了以下错误 2. 问题分析
a在 MapString, Object 中传入 String, Long 类型作为消息并转发接着接收到消息后再从 Map 中取出 String, Long 由于是 Object 类型所以需要强制类型转化然后强制类型转化 Long 引发异常原因是 “Integer 类型不能被转化为 Long”可是我明明传入的 Long 啊
b经过调试也发现RabbitMQ 监听到消息之后Map 中原本是 Long 的数据确实变成了 Integer 类型......
c接着又尝试了以下两种办法
传入String, Long接收到消息后强制类型转化的时候就转为 StringInteger解决了报错问题但是引入了新的问题“这不就丢失了 Long 的精度吗”.直接传入一个实体类对象继承了 Serializable 接口塞入 Long 数据然后发送消息解决了报错问题可是总不能每次遇到 Long 类型都传一个实体类对象吧......自己通过 ObjectMapper 的 writeValueAsString 转化为 JSON然后接收消息之后再通过 readValue 将 JSON 反序列化成 Map结果报错......
网上也搜过这种情况发现好像还没有人提出怎么解决这种情况... 3. 最佳解决办法
那干脆这样做在每次 MapString, Object 中有 Long 类型的时候都先将 Long 类型通过 toString() 转化为字符串然后接收到消息的时候先强转为 String然后再通过 Long.valueOf() 转化为 Long 类型既解决了异常又保证了不丢失精度.
发送消息如下 接收消息如下 成功解决异常