首页 > 解决方案 > 有效 XML 上的 XMLStreamException

问题描述

我目前面临一个奇怪的问题,这并不经常发生。我的应用程序使用带有 JAXB 的 STaX 和XMLStreamReader具有数百万行的 Java-Streams ( ) 解组 XML 文件,如果 XML 已更改,则在启动时将这些对象导入数据库。到目前为止,这一切正常,但在某些设备上除外(大约 5% 的设备超过 1000 台)。在这些设备上,我得到了一个javax.xml.stream.XMLStreamException. 有时重新启动会有所帮助,并且可以成功处理 XML。XML 本身在所有设备上始终具有相同的内容,因此XML 和 XSD 都是有效的

异常也不总是发生在同一个地方。例如:

原因:javax.xml.stream.XMLStreamException: ParseError at [row,col]:[ 2650616 ,17] 消息:元素类型“XX”必须后跟属性规范“>”或“/>”。

之后:

[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[ 3272359,14 ] 消息:元素类型“XY”必须后跟属性规范“>”或“/>”。]

整个应用程序运行在微服务架构中,但不依赖于其他服务。启动时会发生很多事情,因为每个微服务都会初始化自己的状态。对我来说,似乎可能存在一些内存问题,因为它不可重现,并且设备上的微服务在它们的版本上没有区别。

在优化解组过程之前,我希望能够首先重现该问题以确保任何改进都有效。当我尝试减少 Xmx 和 Xms 时,我可能会得到OutOfMemoryException 但永远不会XMLStreamException

现在我在问自己,

感谢您提前提供的所有帮助。

标签: javaxmlxsdjava-streamstax

解决方案


您的问题中没有足够的信息来提供明确的答案,但我们可以帮助您解决问题。

  1. 您看到的变化几乎肯定是由于输入变化,而不是设备故障。

  2. 这些错误表明流不是格式正确的XML。(从技术上讲,文本数据甚至不是 XML;它会导致预验证解析错误。)

  3. 以下是会产生此类错误的格式不正确的 XML 的简单示例:

    <r a='''/>
    

    '请注意,属性值中有一个未转义的。当代码从源中提取数据、无法转义数据并将其写入属性值时,很容易发生这种情况。可变性将来自数据可变性。例如,大多数名称中没有',但O'Toole有。

正如@vanje 在评论中提到的那样,将失败的确切 XML 记录为调试问题的下一步。

也可以看看


推荐阅读