You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:30:31