我在通过XSD架构验证XML时得到TimeoutException,并且与检查器关联的线程被挂起。
为什么会这样?如何避免这种情况?
堆栈跟踪:
TimeoutManage I WTRN0124I: When the timeout occurred the thread with which the transaction is, or was most recently, associated was Thread[WebContainer : 3,5,main]. The stack trace of this thread when the timeout occurred was:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:140)
java.io.BufferedInputStream.fill(BufferedInputStream.java:229)
java.io.BufferedInputStream.read1(BufferedInputStream.java:269)
java.io.BufferedInputStream.read(BufferedInputStream.java:328)
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:700)
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:645)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1205)
org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
org.apache.xerces.impl.xs.opti.SchemaParsingConfig.parse(Unknown Source)
org.apache.xerces.impl.xs.opti.SchemaParsingConfig.parse(Unknown Source)
org.apache.xerces.impl.xs.opti.SchemaDOMParser.parse(Unknown Source)
org.apache.xerces.impl.xs.traversers.XSDHandler.getSchemaDocument(Unknown Source)
org.apache.xerces.impl.xs.traversers.XSDHandler.resolveSchema(Unknown Source)
org.apache.xerces.impl.xs.traversers.XSDHandler.constructTrees(Unknown Source)
org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar(Unknown Source)
org.apache.xerces.jaxp.validation.XMLSchemaFactory.newSchema(Unknown Source)
javax.xml.validation.SchemaFactory.newSchema(Unknown Source)
my.utils.XmlUtils.validate(XmlUtils.java:38)
用于验证的代码片段:
SchemaFactory schemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(xsd)));
Validator validator = schema.newValidator();
...
在以下行发生异常:
Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(xsd)));
如果不看到实际的 XSD,很难确定,但很可能您的架构不是自包含的,而是包含一个或多个引用外部 URL 的 include 语句。schemaFactory 可能会尝试获取它们以构建完整的 XSD。
指向这一点的是堆栈跟踪中对getSchemaDocument()
的调用,该堆栈跟踪试图在您传入的 xsd 上执行parseSchema()
的过程中通过 HTTP 获取架构文档。
如果您的架构引用 W3C 网站上的文档(如 XML 命名空间的架构),则会出现一个特定问题。W3C 故意延迟响应此类请求,以阻止过度使用。这个想法是,您应该重定向此类引用以使用文件的本地副本。