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

升级POI-ooxml至5.2.4后遇NoSuchMethodError问题求助

问题描述

为修复漏洞,将org.apache.poi:poi-ooxml从4.1.2版本升级至5.2.4版本。升级后添加commons-io:commons-io:2.13.0依赖修复了一处错误,但现在出现新异常:

java.lang.NoSuchMethodError: org.apache.poi.xssf.eventusermodel.XSSFReader.getSharedStringsTable()Lorg/apache/poi/xssf/model/SharedStringsTable;

发现poi-ooxml-5.2.4的XSSFReader类中该方法的返回类型为SharedStrings而非SharedStringsTable,不清楚该方法的调用来源及为什么期望返回SharedStringsTable,询问是否有其他人遇到类似问题?是否需要升级其他依赖?

解决方案与分析
  • 问题本质:POI 5.x版本对XSSF相关API做了重构,XSSFReader.getSharedStringsTable()方法的返回类型从SharedStringsTable改为了SharedStrings(SharedStrings是SharedStringsTable的子类),同时该方法已被标记为过时,官方推荐使用新方法getSharedStrings()。出现这个错误是因为有代码(自己项目的代码或依赖的第三方库)仍在按旧的方法签名调用,期望返回SharedStringsTable类型。

  • 定位调用来源:

    • 用IDE的全局文本搜索功能,在项目中查找调用getSharedStringsTable()的代码,确认是自己项目的代码还是第三方依赖库的代码。
    • 用构建工具的依赖分析命令排查版本冲突:
      • Maven:执行mvn dependency:tree,查看是否有其他依赖引入了旧版本的POI模块。
      • Gradle:执行./gradlew dependencies,检查POI相关依赖的版本是否统一为5.2.4。
  • 修复步骤:

    1. 修改自身代码:如果是自己项目的代码调用了该方法,直接将返回类型替换为SharedStrings,或者改用推荐的getSharedStrings()方法。
    2. 升级第三方依赖:如果是第三方库调用了旧API,需要找到该库的最新版本,确认其是否兼容POI 5.x,然后同步升级该依赖。
    3. 统一POI版本:在构建配置中统一管理所有POI相关模块的版本(包括poi、poi-ooxml、poi-ooxml-full等),避免不同模块版本不一致导致的类加载冲突。比如在Maven的dependencyManagement中统一声明版本:
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>org.apache.poi</groupId>
                  <artifactId>poi</artifactId>
                  <version>5.2.4</version>
              </dependency>
              <dependency>
                  <groupId>org.apache.poi</groupId>
                  <artifactId>poi-ooxml</artifactId>
                  <version>5.2.4</version>
              </dependency>
          </dependencies>
      </dependencyManagement>
      

内容的提问来源于stack exchange,提问作者vthangar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:32:45