美文网首页
java.lang.NoSuchFieldError: Fact

java.lang.NoSuchFieldError: Fact

作者: 奔腾的小溪 | 来源:发表于2024-07-16 16:58 被阅读0次

背景

需要使用MultipartFile来接收doc、docx类型的文件,并对文件的内容进行校验是否包含某些模板的文字。

报错过程

1、文件类型不适配

  • 接收文件时docx可以上传成功,但是doc类型报错①如下:
    Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)] with root cause org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)
  • 报错解决方案:
    使用Apache POI的HWPFDocument 来读取doc文件,使用XWPFDocument 读取docx文件。
        try (InputStream is = multipartFile.getInputStream()) {
            // 将MultipartFile转换为HWPFDocument
            HWPFDocument doc = new HWPFDocument(is);
            Range textRange = doc.getRange();
            String text = textRange.text();
         }
`
        try (InputStream is = multipartFile.getInputStream()) {
            XWPFDocument document = new XWPFDocument(multipartFile.getInputStream());
            XWPFWordExtractor extractor = new XWPFWordExtractor(document);
            String text = extractor.getText();
         }
  <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- Apache POI for DOCX files -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>

2、pom引用问题

  • 报错②
java.lang.NoSuchFieldError: Factory
at org.apache.poi.xddf.usermodel.chart.XDDFChart.<init>(XDDFChart.java:152) ~[poi-ooxml-5.2.3.jar:5.2.3] 
  • 解决方案
    Ⅰ 尝试提高pom版本
            <version>5.2.4</version>

结果引入了新的报错③

java.lang.NoSuchMethodError: org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream.builder()Lorg/apache/commons/io/output/UnsynchronizedByteArrayOutputStream$Builder

查了下因为commons.io 版本过低导致的。(https://blog.csdn.net/weixin_48524970/article/details/134379243)
修改commons.io版本为2.13.0后报错③不见了,报错②还在,说明单纯的升级版本解决不了问题。
Ⅱ 终极原因:jar包冲突导致
回退pom版本及commons.io版本。
(https://blog.csdn.net/Wolf__king/article/details/132078098)
1、先百度java.lang.NoSuchFieldError这个异常的意思,得知这个跟jar包冲突有关系
2、根据上述的截图,知道冲突的方法所在的jar包是poi-ooml,找到这一行代码,发现是存在这个factory的。
3、怀疑服务上有两个版本的这个jar包导致的,使用的版本不是预期的这个版本找不到这个代码。登录服务器确认,这个jar包只有这一个版本,怀疑点不对。
4、在从代码入手,查看factory所在的类,ThemeDocument
全代码搜索这个类,Idea的快捷键(ctrl+N)发现有两个jar包包含这个类,poi-ooxml-lite和前面提到的poi-ooxml-schemas这个jar包
5、修改poi-ooxml-schemas版本为 4.1.2 问题解决

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

6、最终的pom为

      <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
        </dependency>

相关文章

  • 依赖冲突

    Caused by: java.lang.NoSuchFieldError: No field BottomNav...

  • 展达OLAP框架说明

    Cube Fact Table table name fact table filter Fact fact na...

  • this is the fact

    Most people making Powerpoint have no power and no point;...

  • A Fact

    I do love you This is a fact thatI don’t mind whether or ...

  • The fact is

    I love myself much more than I love youthus please don’t ...

  • The Fact

    六月明媚陽光下我直視他的眼睛告訴他 我不在乎 消息是好的還是壞的我只是希望 我被告知的消息是真的是符合事實的就像天...

  • Stray Lobster

    The fact is I want chaos The fact is I want peace The fac...

  • Fact OR Opinion

    事实与观点,事实是客观存在的,有真假~观点是自己的个人想法,带有感情色彩。

  • 其实,in fact

    大多数情况下,我们对自己都是自信满满的。 拿到高中或者初中的数学题,匆匆一瞥,简单哇,一种似曾相识的感觉忽然而至。...

  • dimensional & fact

    1.Dimension Table A dimension table is unique to data war...

网友评论

      本文标题:java.lang.NoSuchFieldError: Fact

      本文链接:https://www.haomeiwen.com/subject/ecbkhjtx.html