【问题标题】:Stackoverflow for huge xmlStackoverflow 用于巨大的 xml
【发布时间】:2017-02-17 06:04:03
【问题描述】:

在我的网络服务中,当我尝试运行具有大量内容的 XML 时,我遇到了错误。

输入是基于 SOAP 的网络服务。此错误出现在任何处理开始之前。我正在运行我的应用程序的服务器是weblogic 12.1.3. Java 1.7 版。

我不确定如何解决此错误,因为我需要让我的服务接受较大的 XML 内容

java.lang.StackOverflowError
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1700)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2908)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2791)
        at com.sun.xml.stream.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2932)

【问题讨论】:

  • 如此庞大的 XML 中有什么?是否有可以删除的重复标签以创建更小的 XML?这么小的 XML 会运行吗?
  • 是的,小 xml 运行。内容正确。要求是通过 web 服务处理大型 xml 数据。达到一定阈值的服务器能够接受请求。除此之外,服务器日志充满了 stackoverflow 错误
  • 您是否尝试过增加 JVM 的最大堆大小并尝试运行?你能找出 xml 变大到足以引发错误的确切阈值吗?
  • 我尝试将每个线程的堆栈大小增加到 6M (-Xss)。它一直工作到消息内容的大小为 300k (characters) 。但是消息内容可以超过 300k 和高达 500k 。所以进一步增加 -Xss 对我来说不是一个选择
  • 什么版本的 Java 7?我的 jdk1.7.0_79 没有 next() 在这些行(或任何地方)调用自己,并且有一个固定的错误:JDK-2204370

标签: java xml web-services


【解决方案1】:

stackoverflow 错误:这是因为在 EAP 库中添加了旧的 webservice-rt.jar。我错误地查看了堆栈跟踪,发现这些类来自它。删除了罐子,它解决了它。 对于未知的 JAXB 内容,我尝试在各种博客上寻找答案,但找不到答案。然后我反编译了 jars 并在下面发现这有助于解决这个错误。由于 JDK 和 weblogic 中具有不同版本的类而出现错误。

-Djavax.xml.bind.JAXBContext=com.sun.xml.bind.v2.ContextFactory

【讨论】:

    【解决方案2】:

    有基于流的 XML 解析器。如果您可以在 Web 服务(框架)中操作解析,则可以使用它们。

    看看StAX

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2018-11-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2014-07-22
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多