【问题标题】:SAXParseException XML-20221 Invalid char in textSAXParseException XML-20221 文本中的字符无效
【发布时间】:2012-06-11 09:18:57
【问题描述】:

对于独立的 Java 应用程序,我们看到非常罕见的错误,其中包含有效 XML 内容的字符串会导致 JAXB 抛出异常,例如:

javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException: 
    <Line 1, Column 129>: XML-20221: (Fatal Error) Invalid char in text.]

这是一个非常古老的 Java 应用程序,它是为旧版本的 Java 编写的,我们有一个现有的依赖项:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>xdb-xmlparser</artifactId>
    <version>10.2.0.3.0</version>
</dependency>

错误代码始终为 XML-20221,但原因可能不同,例如:

XML-20221: (Fatal Error) Invalid char in text.

XML-20100: (Fatal Error) Expected '?>'.]

XML-20121: (Fatal Error) End tag does not match start tag 'TotalDepositReqd'.

堆栈跟踪的其余部分也有所不同,但通常如下所示:

at oracle.xml.parser.v2.XMLError.flushErrorHandler(XMLError.java:415)
at oracle.xml.parser.v2.XMLError.flushErrors1(XMLError.java:284)
at oracle.xml.parser.v2.NonValidatingParser.parseEndTag(NonValidatingParser.java:1359)
at oracle.xml.parser.v2.NonValidatingParser.parseElement(NonValidatingParser.java:1304)
at oracle.xml.parser.v2.NonValidatingParser.parseRootElement(NonValidatingParser.java:326)
at oracle.xml.parser.v2.NonValidatingParser.parseDocument(NonValidatingParser.java:293)
at oracle.xml.parser.v2.XMLParser.parse(XMLParser.java:209)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211)

我们的 Java 版本是:

java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)

我们当前的命令行是:

java
-server
-Xmx2048m
-Xms2048m
-XX:MaxPermSize=128m
-XX:+UseConcMarkSweepGC
-Dsun.rmi.dgc.server.gcInterval=0x2932E00
-Dsun.rmi.dgc.client.gcInterval=3600000
-verbosegc
-Xloggc:/path/to/file
-gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djava.endorsed.dirs=/path/to/endorsed
-Duser.country=GB
-Duser.language=en
-Dhttp.keepAlive=false foo.ListenerServer

通常我们会在几秒钟内看到这些小突发事件,这表明 某些内部缓冲区已损坏? JVM 运行的时间越长,这些异常就越常见。 JVM 的反弹解决了几天的问题。

  • 有其他人见过类似的东西吗?
  • 如果是这样,您是否设法解决了这个问题?
  • 也许我们应该转向不同的 JAXB/JAXP 实现?

【问题讨论】:

  • 我仍然会对 XML 内容感兴趣。也可能是您在不同的系统属性 file.encoding 上运行了一段时间,这是默认编码。在其余代码中搜索“file.encoding”或明确编码。
  • 我会先看看 Joop 建议的 XML。也许这些blogs.oracle.com/alanb/entry/heap_dumps_are_back_with 可以提供帮助?

标签: java jaxb xml-parsing


【解决方案1】:

当开发人员缓存Unmarshaller 实例并在不同线程之间共享它时,我看到了类似的问题(解组过程中的零星异常)。根据文档,Unmarshaller 不是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多