原因:java.lang.NoSuchMethodError:org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/ut‌​;il/迭代器;

原因:java.lang.NoSuchMethodError:org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/ut‌​;il/迭代器;,java,web-services,weblogic12c,Java,Web Services,Weblogic12c,我很难找出这个错误的原因: org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator; 我有JAX-WS服务,用POI解析Excel文件。服务在Weblogic服务器上工作。这是Weblogic的回应: The selected operation convert could not be invoked. A fault occurred while invoking the webservice oper

我很难找出这个错误的原因:

org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
我有JAX-WS服务,用POI解析Excel文件。服务在Weblogic服务器上工作。这是Weblogic的回应:

The selected operation convert could not be invoked.
A fault occurred while invoking the webservice operation. The fault is : <ns0:Fault xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.w3.org/2003/05/soap-envelope">
<faultcode>ns0:Server</faultcode>
<faultstring>org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;</faultstring>
</ns0:Fault>
oracle.sysman.emInternalSDK.webservices.util.SoapTestException: Client received SOAP Fault from server : org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator;
无法调用所选的转换操作。 调用webservice操作时发生错误。故障是: ns0:服务器 org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator; oracle.sysman.Eminernalsdk.webservices.util.SoapTestException:客户端从服务器接收到SOAP错误:org.apache.poi.ss.usermodel.Workbook.sheetIterator()Ljava/util/Iterator; 奇怪的是,这段代码可以在我的PC上运行,可以在Weblogic 11g上运行,但不能在Weblogic 12c上运行

@WebService
public class Excel2XMLConverter {
    @WebMethod
    public @WebResult(name = "convertedData") String convert(@WebParam(name = "excelData") byte[] data) throws Exception{

        System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.NullLogger");

        BufferedInputStream bfs = new BufferedInputStream(new ByteArrayInputStream(data));

        Workbook wb = WorkbookFactory.create(new ByteArrayInputStream(data));
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();
        doc.createElementNS("http://namespace.org", "wb:workbook");
        Element workbookElement = doc.createElementNS("http://namespace.org", "workbook");
        workbookElement.setPrefix("wb");
        doc.appendChild(workbookElement);


        for(Iterator<Sheet> i = wb.sheetIterator(); i.hasNext();){
            Element sheetElement = doc.createElementNS("http://namespace.org", "sheet");
            sheetElement.setPrefix("wb");
            workbookElement.appendChild(sheetElement);
            Sheet sheet = i.next();        

            for(Iterator<Row> j = sheet.rowIterator(); j.hasNext(); ){

                Row row = j.next();
                Element rowElement = doc.createElementNS("http://namespace.org", "row");
                rowElement.setPrefix("wb");
                sheetElement.appendChild(rowElement);

                for(Iterator<Cell> k = row.cellIterator(); k.hasNext(); ){            
                    Cell cell = k.next();       
                    cell.setCellType(CellType.STRING);
                    Element cellElement = doc.createElementNS("http://namespace.org", "cell");
                    cellElement.setPrefix("wb");
                    cellElement.setAttribute("value", cell.getStringCellValue());
                    rowElement.appendChild(cellElement);
                }        
            }            
        }


        StringWriter sw = new StringWriter();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.transform(new DOMSource(doc), new StreamResult(sw));


        return  sw.toString();
    }
@WebService
公共类Excel2XMLConverter{
@网络方法
public@WebResult(name=“convertedData”)字符串转换(@webgram(name=“excelData”)字节[]数据)引发异常{
set属性(“org.apache.poi.util.POILogger”、“org.apache.poi.util.NullLogger”);
BufferedInputStream bfs=新的BufferedInputStream(新的ByteArrayInputStream(数据));
工作簿wb=WorkbookFactory.create(newbytearrayinputstream(data));
DocumentBuilderFactory工厂=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder=factory.newDocumentBuilder();
Document doc=builder.newDocument();
doc.createElements(“http://namespace.org“,“wb:工作簿”);
元素workbookElement=doc.createElements(“http://namespace.org“,”工作簿“);
workbookElement.setPrefix(“wb”);
单据附件子项(workbookElement);
for(迭代器i=wb.sheetIterator();i.hasNext();){
元素sheetElement=doc.createElements(“http://namespace.org“,”表“);
sheetElement.setPrefix(“wb”);
workbookElement.appendChild(sheetElement);
工作表=i.下一页();
for(迭代器j=sheet.rowIterator();j.hasNext();){
行=j.next();
元素行元素=doc.createElements(“http://namespace.org“,”世界其他地区“);
rowElement.setPrefix(“wb”);
sheetElement.appendChild(行元素);
for(迭代器k=row.cellIterator();k.hasNext();){
Cell=k.next();
cell.setCellType(CellType.STRING);
元素cellElement=doc.createElements(“http://namespace.org“,”细胞“);
cellElement.setPrefix(“wb”);
setAttribute(“value”,cell.getStringCellValue());
appendChild(cellElement);
}        
}            
}
StringWriter sw=新的StringWriter();
TransformerFactory tf=TransformerFactory.newInstance();
变压器=tf.新变压器();
setOutputProperty(OutputKeys.OMIT_XML_声明,“no”);
setOutputProperty(OutputKeys.METHOD,“xml”);
transformer.setOutputProperty(OutputKeys.INDENT,“是”);
transformer.setOutputProperty(OutputKeys.ENCODING,“UTF-8”);
transformer(新的DOMSource(doc)、新的StreamResult(sw));
返回sw.toString();
}

无论如何,我认为这个错误与代码无关,因为它不适用于Weblogic 12c。此外,我不知道这种类型的错误通常意味着什么。

当JVM加载一个类并尝试将其链接到第二个类时,会发生此异常。第一个类的代码是针对第二个类的不同版本编译的具体地说,它希望第二个类中的某个方法有一个签名,但该签名不存在


简言之,您要么根据错误的POI版本编译,要么使用/包含了错误的POI JAR文件在您的部署中。

我认为存在一个问题,您的类路径中有一个较旧版本的POI,它可能与同样位于类路径上的较新版本冲突,或者较新版本根本不在类路径上。工作簿#sheetIterator()已添加到此提交中:并且自版本3.13起可用


您必须确保Weblogic部署中的类路径上没有旧版本的POI。这包括WAR文件和任何Weblogic系统库文件夹,无论它们是什么。

感谢大家的帮助。这确实是类加载器的问题。您可以通过以下方式找到:

在启动文件中添加java选项verbose:class 下面是startweblog.sh文件中的条目(就在weblogic的开头上方 服务器)添加详细:类。无需将其添加到 startweblog.sh文件。任何位置都可以。请确保 在服务器启动期间被拾取

export JAVA_OPTIONS=“${JAVA_OPTIONS}-verbose:class”

服务器重新启动后,stdout将包含有关类如何运行的信息 已加载

在我的例子中,有人把旧的POI库放进去了 /oracle//user\u projects/domains/%domain\u name%/lib。 来自该目录的JAR将自动添加到类路径

但这还不是全部。因为Weblogic使用Apache Commons Net,所以此库也存储在服务器上:

[Loaded org.apache.commons.net.SocketClient from file:/oracle/<server_name>/wlserver/modules/commons-net.commons-net.jar]
[Loaded org.apache.commons.net.ftp.FTP from file:/oracle/<server_name>/wlserver/modules/commons-net.commons-net.jar]
[Loaded org.apache.commons.net.ftp.FTPClient from file:/oracle/<server_name>/wlserver/modules/commons-net.commons-net.jar]
[Loaded org.apache.commons.net.ftp.FTPHTTPClient from file:/oracle/<server_name>/user_projects/domains/<domain_name>/servers/soa_server1/dc/soa_02656c56-2df4-449a-b79e-ae2f074f34a1/SCA-INF/lib/commons-net-3.5.jar]
[从文件加载org.apache.commons.net.SocketClient:/oracle//wlserver/modules/commons-net.commons-net.jar]
[已从文件加载org.apache.commons.net.ftp.ftp:/oracle//wlserver/modules/commons-net.commons-net.jar]
[已从以下文件加载org.apache.commons.net.ftp.FTPClient:/oracle//wlserver/modules/commons-net.commons-net.jar]
[已从以下文件加载org.apache.commons.net.ftp.FTPHTTPClient:/oracle//user_projects/domains//servers/soa_server1/dc/soa_02656c56-2df4-449a-b79e-ae2f074f34a1/SCA-INF/lib/commons-net-3.5.jar]
所以,当FTP