为了账号安全,请及时绑定邮箱和手机立即绑定

Spring如何加载XSD文件以及抱错

/ 猿问

Spring如何加载XSD文件以及抱错

蝴蝶不菲 2018-07-18 14:14:22

Spring如何加载XSD文件以及抱错


查看完整描述

1 回答

?
慕运维8079593

有时候你会发现过去一直启动正常的系统,某天启动时会报出形如下面的错误:

org.xml.sax.SAXParseException: schema_reference.4:Failed to read schema document 'http://www.springframework.org/schema/beans/spring-beans-2.0.xsd', because1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.很显然,spring xml配置文件中指定的xsd文件读取不到了,原因多是因为断网或spring的官网暂时无法连接导致的。 你可以通过在浏览器输入xsd文件的URL,如:http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 进行确认。

关于这个问题,网上有两种常见的解决方法,第一种简单有效,但是工作量大,即:把所有spring配置文件中url形式的xsd路径转换成指向本地xsd文件的classpath形式的路径,例如:classpath:org/springframework/beans/factory/xml/spring-beans-2.5.xsd ,再有一种方法就是在本机搭建web服务器,按URL创建相应文件夹,放入对应xsd文件,在本机hosts文件中加入"127.0.0.1 www.springframework.org".实际上,这两种方法都属于“歪打正着”式的方法,直正弄明白这一问题还需要从spring的XSD文件加载机制谈起。

首先:你必须知道一点:spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路径下载。这是非常合理的做法,并不像看上去的那样,每次都是从站点下载的。事实上,假如你的所有配置是正确定的,你的工程完全可以在断网的情况下启动而不会报上面的错误。Spring加载xsd文件的类是PluggableSchemaResolver,你可以查看一下它的源码来验证上述说法。另外,你可以在log4j.xml文件中加入:

<logger name="org.springframework.beans.factory.xml"> <level value="all" /> </logger>通过日志了解spring是何加载xsd文件的。

接下来,问题就是为什么spring在本地没有找到需要的文件,不得不转向网站下载。关于这个问题,其实也非常简单。在很多spring的jar包里,在META-INF目录下都有一个spring.schemas,这是一个property文件,其内容类似于下面:


查看完整回答
反对 回复 2018-08-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信