使用spring-redisearch执行搜索命令时触发UnsupportedOperationException异常
使用spring-redisearch执行搜索命令时触发UnsupportedOperationException异常
嘿,我之前也碰到过几乎一模一样的问题,一眼就揪出是不可修改的空Map在搞鬼!
你看异常栈的根源——Collections$.EmptyMap是Java自带的不可修改空集合,它压根不支持put操作,但Lettuce的MapOutput解码逻辑偏要往这个空Map里写入搜索结果数据,可不就直接炸出UnsupportedOperationException了嘛。
给你几个具体的排查和解决方向:
- 先自查业务代码:有没有在构建搜索请求、设置返回参数的时候,不小心把
Collections.emptyMap()当结果容器传进去了?比如调用某些重载方法时用了默认的空Map参数,赶紧把它换成new HashMap<>()或者其他可修改的Map实现。 - 检查版本兼容性:spring-redisearch、Lettuce还有Spring Data Redis这几个组件的版本得搭对,有些旧版本的整合逻辑里会默认用不可修改的空Map初始化结果容器,换成官方推荐的兼容版本组合大概率能解决。
- 自定义输出处理:如果是
SearchOutput解码环节的问题,你可以尝试显式指定搜索方法的结果载体为可修改Map,或者自定义一个SearchOutput子类,在初始化时用可修改Map代替默认的空Map。 - 快速调试技巧:给
io.lettuce.core.output.MapOutput.set方法打个断点,看看传入的Map实例是不是Collections.emptyMap(),顺着调用栈往上找,就能精准定位到哪一行代码生成了这个不可修改的Map,直接在源头替换就行。
举个简单的临时修复例子,比如你原本的代码可能是这样:
// 有问题的代码:使用了不可修改的emptyMap SearchResult result = searchClient.search(query, Collections.emptyMap());
改成:
// 替换为可修改的HashMap作为结果容器 Map<String, Object> resultContainer = new HashMap<>(); SearchResult result = searchClient.search(query, resultContainer);
备注:内容来源于stack exchange,提问作者Ted Han Neversummer
相关产品推荐
相关产品推荐

