升级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。
- Maven:执行
- 用IDE的全局文本搜索功能,在项目中查找调用
修复步骤:
- 修改自身代码:如果是自己项目的代码调用了该方法,直接将返回类型替换为
SharedStrings,或者改用推荐的getSharedStrings()方法。 - 升级第三方依赖:如果是第三方库调用了旧API,需要找到该库的最新版本,确认其是否兼容POI 5.x,然后同步升级该依赖。
- 统一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
相关产品推荐
相关产品推荐

