본문 바로가기
FullStack/21. Java

[POI] java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold

by nakanara 2020. 11. 4.
반응형

image

[POI] java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold

POI 이용하여 EXCEL 파일 만드는 기능이 잘 되다가 어느 시점에서 문제가 발생했다.
특이한 점은 오류가 발생해야 정상인 것 같은데, 로컬과 Docker로 이루어진 서버에서는 오류가 안나는 것에 대해서는 원인을 발견하지 못했다.(해당 부분은 확인이 필요한 것 같다)

 

둘 다 openjdk 1.8, tomcat 8.5.x이었는데 버전만 다를 뿐인데 하나의 서버에서는 setSaveCDataLengthThreshold 해당 메서드를 찾지 못한다는 문구가 계속 발생하였다.

java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold

SEVERE [http-nio-33006-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jsp] in context with path [] threw exception [javax.servlet.ServletException: java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold(I)Lorg/apache/xmlbeans/XmlOptions;] with root cause
        java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveCDataLengthThreshold(I)Lorg/apache/xmlbeans/XmlOptions;
                at org.apache.poi.xssf.model.SharedStringsTable.writeTo(SharedStringsTable.java:210)
                at org.apache.poi.xssf.model.SharedStringsTable.commit(SharedStringsTable.java:225)
                at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:313)
                at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:317)
                at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:173)
                at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:768)

오류 나는 파일을 확인하니 setSaveCDataLengthThreshold를 호출하고 있는데 XmlOptions 클래스에 해당 함수가 존재하지 않았다.

  • ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java
    /**
     * Write this table out as XML.
     *
     * @param out The stream to write to.
     * @throws IOException if an error occurs while writing.
     */
    public void writeTo(OutputStream out) throws IOException {
        XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
        // the following two lines turn off writing CDATA
        // see Bugzilla 48936
        xmlOptions.setSaveCDataLengthThreshold(1000000);
        xmlOptions.setSaveCDataEntityCountThreshold(-1);
        //re-create the sst table every time saving a workbook
        CTSst sst = _sstDoc.getSst();
        sst.setCount(count);
        sst.setUniqueCount(uniqueCount);
        _sstDoc.save(out, xmlOptions);
    }

이전에 POI 라이브러리의 버전을 3.9로 변경하였다.

결론은 변경 시점에 xmlbeans 라이브러리가 org.apache로 이동한 것을 파악하지 못해 이전 버전인 2.2.0을 사용하여 문제가 발생했다.

xmlBeans 관련 버전을 2.4 이상으로 변경하면 해당 오류는 없어질 것이며, 3.1.0을 많이 사용하고 있어 해당 버전으로 변경하였다.

  • POI
<properties>
    <poi.version>3.9</poi.version>    
</properties>

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>${poi.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>${poi.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>${poi.version}</version>
</dependency>
  • xmlbeans 관련
<properties>
    <xmlbeans.version>3.1.0</xmlbeans.version>
</properties>
<!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>${xmlbeans.version}</version>
</dependency>

 

xmlbeans-xpath 관련 Jar를 dependency 할 경우 sanon9에 대한 필요성이 언급되는데 해당 jar는 업데이트가 진행되지 않아서 어떻게 처리해야 할지 모르겠다. 현재 시점에서는 xml처리를 진행하지 않아서 문제가 없는 것 같은데 좀 더 확인이 필요한 것 같다.  

 

 

참고

#poi #xmlpublic #setSaveCDataLengthThreshold

반응형