java.lang.NoSuchFieldError:在 Payara 项目中使用 Apache POI XSSFWorkbook 时出现工厂错误

问题描述 投票:0回答:1

我在 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 中提到的依赖项是否存在任何已知的冲突或兼容性问题? 任何有关如何解决此问题的见解或建议将不胜感激。

谢谢!

apache-poi
1个回答
0
投票

使用错误版本的

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>
© www.soinside.com 2019 - 2024. All rights reserved.