Redis发布/订阅功能中的类型转换异常DEBUG

首先在聊天室的代码中引入redis的pub/sub
这个可以点击下面的的链接来参考实现

spring boot 集成redis的发布订阅机制

先抛出结论

1.StringRedisTemplate的converAndSend()方法的第二个参数只能传byte类型的数组或者String。
2.StringRedisTemplate中的StringRedisSerializer类继承了RedisSerializer这个泛型接口,只支持String类型。

1.创建消息适配器(即消息处理的方法类)


2.png

2.创建监听容器并绑定消息适配器


1.png

3.在业务代码中把需要发布到频道里的消息写进来(注意上图中红框的部分与参考的网站不同,他用的是String 在这里我想直接传Message对象 ,而后把适配器里的接收类型也换成Message,岂不是省了转成json再转回来的操作,实际上哪有这么简单)。注意这里的redisTemplate是StringRedisTemplate类。


3.png

10.png

4.开始发消息测试,报系统错误。


FJ~5PY33R`H6SMAQ`3(OM1F.png

5.看看后台怎么说,很明显的类型转换异常,难道里面需要把message强转成String?到这里我已经意识到不能随便传类型了,但是为什么?


5.png

6.可以看到方法是可以传Object类的,我当时的理解就是所有类型应该都是可以的,反正都能向上转型成Object类。


4.png

7.别急,先定位到这个方法打个断点,进去看看里面是什么(当时我也在担心里面会不会有一堆弯弯绕绕的东西把自己搞晕,不过先看了再说)


6.png

8.按F5进这个方法看实现(这里我用的是eclipse,不同IDE可能快捷键不同),很明显需要把message转成byte[]数组,上面说的是Message的转型错误 一路F6下来到这一行 再F5进去看看是什么


7.png

9.rawValue又return了个叫serialize的方法,这是个RedisSerializer类对象,听名字就知道跟序列化有关系,进去看看


PD{GBYZTX5_N}MF}I{GD448.png

LL1APR0BF)$ZCBCR4HKW`(3.png

10.String泛型的接口的实现类,也就是说这个接口的实现类传的参数只能是String,往下找到方法
EP[L{K1AJA%AWJ(7C8F_F]S.png

11.应该是就到这一步,发现需要传的参数是String,而我传了一个自己创的实体类,Message对象,他自动强转成String类型失败,导致报错。


8.png

13.把方法中传的参数改成Message的json字符串,问题得以解决。
E{67TJGG7KY433{(PRJSRX5.png

你可能感兴趣的:(Redis发布/订阅功能中的类型转换异常DEBUG)