我在 Payara 项目中遇到运行时错误,该错误涉及 Apache POI 的 XSSFWorkbook 类的使用。错误信息如下:
java.lang.NoSuchFieldError: Factory
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:506)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:233)
// ... (more stack trace)
背景:
我正在使用 Java EE 技术开发 Payara 项目。 当尝试在 DataUploadBean 类的 createTemplateForItemWithFeeUpload 方法中创建 XSSFWorkbook 实例时,会发生此错误。 我已在 pom.xml 中包含了相关依赖项,包括 Apache POI 的 poi-ooxml 版本 5.2.5。
相关依赖(来自pom.xml):
<!-- Apache POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
<version>1.0.6</version>
</dependency>
导致问题的相关方法
public void createTemplateForItemWithFeeUpload() {
try {
// The following line triggers the NoSuchFieldError
XSSFWorkbook workbook = new XSSFWorkbook();
// Additional code...
} catch (Exception e) {
// Handle exceptions...
}
}
问题:
在 Apache POI 的 XSSFWorkbook 上下文中,什么可能导致与 Factory 相关的 NoSuchFieldError? 我的 pom.xml 中提到的依赖项是否存在任何已知的冲突或兼容性问题? 任何有关如何解决此问题的见解或建议将不胜感激。
谢谢!
使用错误版本的
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook
时会发生该异常。在包 ooxml-schemas-* 的版本中,它具有子类 public static final class Factory
,而在包 poi-ooxml-full-5.* 的版本中,它具有 final class Factory
。因此子类 org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.Factory
具有不同的签名。
版本 Apache POI 5 及更高版本需要包
poi-ooxml-full-5.*
并且无法再使用包 ooxml-schemas-*
工作。
就您而言
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
<version>1.0.6</version>
</dependency>
拉动
org.apache.poi.xwpf.converter.core-1.0.6
,进而拉动 ooxml-schemas-1.1
。那是错误的。因此 Apache POI 5 与 org.apache.poi.xwpf.converter.xhtml-1.0.6
不兼容。
尝试使用
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
<version>2.0.4</version>
</dependency>
相反。这会拉动
fr.opensagres.poi.xwpf.converter.core-2.0.4
,然后拉动 poi-ooxml-full-5.2.0
。
要与 Apache POI 5.2.5 完全兼容,应该是
poi-ooxml-full-5.2.5
。所以这也应该添加为依赖项。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-full</artifactId>
<version>5.2.5</version>
</dependency>