首页 > 解决方案 > SaxonEE:9.8 ClassNotFoundException:执行 saxonValidator.validate 时 AtomicTypeValidator

问题描述

我使用 Saxon EE API 来通过 XSD 验证 XML 有效负载。我的环境是 OSGi。

对于特定的 XSD,我面临一个奇怪的错误。

java.lang.NoClassDefFoundError: com/saxonica/ee/bytecode/simtype/AtomicTypeValidator
   at java.lang.ClassLoader.defineClass1(Native Method)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:858)
   at java.lang.ClassLoader.defineClass(ClassLoader.java:704)
   at net.sf.saxon.java.JavaPlatform$MyClassLoader.registerClass(JavaPlatform.java:441)
   at com.saxonica.ee.bytecode.util.CompilerService.makeClass(CompilerService.java:1067)
   at com.saxonica.ee.bytecode.util.CompilerService.compileAtomicValidator(CompilerService.java:1241)
   at com.saxonica.ee.schema.UserAtomicType.validateContent(UserAtomicType.java:373)
   at com.saxonica.ee.validate.SimpleContentValidator.endElement(SimpleContentValidator.java:239)
   at com.saxonica.ee.validate.ValidationStack.endElement(ValidationStack.java:412)
   at net.sf.saxon.event.ProxyReceiver.endElement(ProxyReceiver.java:182)
   at net.sf.saxon.event.StartTagBuffer.endElement(StartTagBuffer.java:290)
   at com.saxonica.ee.validate.StartTagBufferEE.endElement(StartTagBufferEE.java:58)
   at net.sf.saxon.event.PathMaintainer.endElement(PathMaintainer.java:62)
   at net.sf.saxon.event.DocumentValidator.endElement(DocumentValidator.java:68)
   at net.sf.saxon.event.ReceivingContentHandler.endElement(ReceivingContentHandler.java:459)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2967)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
   at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
   at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
   at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
   at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
   at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
   at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
   at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:427)
   at net.sf.saxon.event.Sender.send(Sender.java:164)
   at com.saxonica.ee.s9api.SchemaValidatorImpl.validate(SchemaValidatorImpl.java:587)

观察:如果我们限制有效负载大小,即在这个 xml 元素数量内,具有相同 XSD 和有效负载的场景可以正常工作;如果我们减少到少于 80 个元素,它可以工作,超过 80 个元素我们会得到以下错误。

有什么帮助吗?

标签: xmlxsdsaxonxml-validation

解决方案


在使用 OSGi 的环境中,我们遇到了一些涉及 Saxon 字节码生成的类似问题,请参阅

https://saxonica.plan.io/issues/4036

https://saxonica.plan.io/issues/3814

在这些情况下,用户可以通过在 Saxon 配置上设置不同的类加载器来解决问题。

我一直有点不愿意更改这方面的产品代码,因为它很难测试。使用自定义类加载的环境(例如 Websphere 和 Eclipse)往往是我们没有在“实验室”安装的东西,这使得我们很难确保我们所做的任何更改都不会导致其他工作负载失败。

问题只在文件达到一定大小时才出现的原因是字节码生成只发生在已经执行了一定次数的代码片段中,以确保生成代码的成本不会产生益处。(在这种情况下,通过模式验证,字节码正在针对特定的用户定义的 XSD 简单类型执行验证)。

当然,您可以通过配置上的适当设置完全禁用字节码生成。


推荐阅读