调用SOAP WSDL触发文件提前结束错误,寻求解决办法
错误信息
[ERROR] 文件提前结束。
第1行,来自http://www.w3.org/2005/05/xmlmime[ERROR] org.xml.sax.SAXParseException; systemId: http://www.w3.org/2005/05/xmlmime; lineNumber: 1; columnNumber: 1; 文件提前结束。
第1行,来自https://*********************************-soap/soap02?wsdl
解决方案
本地缓存Schema文件
手动下载http://www.w3.org/2005/05/xmlmime对应的XSD文件到本地,修改WSDL中的schema引用,将远程地址替换为本地文件路径。例如把:<import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="http://www.w3.org/2005/05/xmlmime"/>改成:
<import namespace="http://www.w3.org/2005/05/xmlmime" schemaLocation="file:///本地路径/xmlmime.xsd"/>关闭远程Schema自动加载
在XML解析器中禁用外部Schema加载。比如Java环境下,给SAXParser设置特性:SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);soapUI里可以在
File > Preferences > XML Settings中找到相关选项,关闭远程Schema验证或加载。排查网络拦截
确认所在环境的代理、防火墙是否屏蔽了对w3.org的HTTPS请求。企业内网通常会拦截这类外部公共资源,需要将http://www.w3.org加入白名单,或者配置正确的代理参数让解析器正常访问。通过绑定文件指定本地Schema
若用Java生成客户端(如jaxws-maven-plugin),创建binding.xml绑定文件,将远程Schema映射到本地资源:<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <jaxws:bindings schemaLocation="http://www.w3.org/2005/05/xmlmime"> <xsd:appinfo> <jaxws:package name="org.w3._2005._05.xmlmime"/> </xsd:appinfo> </jaxws:bindings> </jaxws:bindings>将xmlmime.xsd放到项目resources目录,插件会自动读取本地文件。
用XML Catalog映射远程地址
创建OASIS格式的catalog.xml文件,把远程Schema地址映射到本地:<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> <rewriteURI uriStartString="http://www.w3.org/2005/05/xmlmime" rewritePrefix="file:///项目路径/src/main/resources/schemas/"/> </catalog>执行wsimport时加上
-catalog参数:wsimport -catalog catalog.xml https://你的WSDL地址?wsdl
内容的提问来源于stack exchange,提问作者Saverio

