前天用websocke做了个项目,收发消息嘛。
我在websocke收到消息的时候,需要操作redis数据库。
大概是这样↓
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
redisCacheManager .set("name","jy");
}
一直给我报错。
java.lang.NoClassDefFoundError: Could not find required flavor of command required by ‘redis.clients.jedis.Connection#sendCommand’.
如果照着网上的讲,是jedis和spirng-redis的包不兼容的问题。
这个问题,具体参考。装了无数遍完全没有用。
https://blog.csdn.net/Qizhan_feng/article/details/90216361
鼓捣了两天,真的整整两天没搞定。
最后在这个地方↓看到了解决方案。
https://segmentfault.com/q/1010000009789923
所以问题就是:其实是websocket类没有被spring管控,它就是个普通的类。直接在这里放spirng的注解会实例化一个错误的类。
我们需要手动从从当前application的getBen方法拿对应的service
方法如下:
https://www.cnblogs.com/againn/p/9013751.html
然后原方法里改成:
redisCacheManager = (RedisCacheManager )ApplicationHelper.getBean("redisCacheManager ");
System.out.println(redisCacheManager .get("lion"));
大功告成!
分割线-----------------------------------------------------------
好了 ,我又遇到一模一样的错误了,晕。
重启项目之后上个方法不管用了。我震惊了,差点又想自闭。
沃曰,奇了怪了。
于是又找到了解决方法,
不知道什么原因,需要在使用这个报错的类之前,必须在其他地方实例化这个对象一次。
例如在一个Controller中先实例化一次这个。
RedisCacheManager redisCacheManager = (RedisCacheManager)ApplicationHelper.getBean("redisCacheManager");
然后在websocket方法里,才能照着上面的方法用这个。千万别在websocket的方法里第一次实例化它。给我疯狂报错。我怀疑是不是websocket比较复杂,是不是多线程的问题或者单例多例的问题。毕竟我对这方面理解不深。
分割线-----------------------------------------------------------
哎 其实这个是写给我自己看的。。我不期待会有谁看得到。如果你有我一样的遭遇,希望能看到这个文章帮助你有一点思路。有用的话记得评论一下!我会看到很开心!