版权声明:本文为博主原创文章,未经博主允许不得转载。

XML的一些概念

首先来看下xml的一些概念:

xml的schema里有namespace,可以给它起个别名。比如常见的spring的namespace:

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

通常情况下,namespace对应的URI是一个存放XSD的地址,尽管规范没有这么要求。如果没有提供schemaLocation,那么Spring的XML解析器会从namespace的URI里加载XSD文件。我们可以把配置文件改成这个样子,也是可以正常工作的:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

schemaLocation提供了一个xml namespace到对应的XSD文件的一个映射,所以我们可以看到,在xsi:schemaLocation后面配置的字符串都是成对的,前面的是namespace的URI,后面是xsd文件的URI。比如:

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/security

http://www.springframework.org/schema/security/spring-security.xsd"

Spring是如何校验XML的

Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。

为了防止这种情况,Spring提供了一种机制,默认从本地加载XSD文件。打开spring-context-3.2.0.RELEASE.jar,可以看到里面有两个特别的文件:

spring.handlers

http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler

http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler

http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler

http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler

http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

spring.schemas

http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd

http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd

http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd

http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd

http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd

...

再打开jar包里的org/springframework/context/config/ 目录,可以看到下面有

spring-context-2.5.xsd

spring-context-3.0.xsd

spring-context-3.1.xsd

spring-context-3.2.xsd

很明显,可以想到Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。

并且Spring很贴心,把旧版本的XSD文件也全放了。这样可以防止升级了Spring版本,而配置文件里用的还是旧版本的XSD文件,然后断网了,应用启动不了。

我们还可以看到,在没有配置版本号时,用的就是当前版本的XSD文件:

http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd

如何跳过Spring的XML校验?

可以用这样的方式来跳过校验:

GenericXmlApplicationContextcontext=newGenericXmlApplicationContext();

context.setValidating(false);

这样可以解决在断网情况下加载xsd文件连接超时的问题。

schema_reference.4:无法读取方案文档 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd,原因是1)无法找到文档 2)无法读取文档 3)文档的根元素不是.

caused by java.net.ConnectionException:Connection timed out:connect.

...

原因就是在spring的jar包中META-INF/spring.schemas中没有加上

http\://www.springframework.org/schema/aop/spring-aop-2.0.xsd=org/springframework/aop/config/spring-aop-2.0.xsd

http\://www.springframework.org/schema/aop/spring-aop-2.5.xsd=org/springframework/aop/config/spring-aop-2.5.xsd

http\://www.springframework.org/schema/aop/spring-aop-3.0.xsd=org/springframework/aop/config/spring-aop-3.0.xsd

http\://www.springframework.org/schema/aop/spring-aop.xsd=org/springframework/aop/config/spring-aop-3.0.xsd

没有加上这个,则xsd加载时就会去网上找,在无网情况下就会报错。

另外,使用eclipse的导出为可运行jar包时,多个spring jar包同时有,spring.handlers、spring.schemas、spring.tooling三个文

件,但是打成jar包时在META-INF/下只能留一份,这时需要将多个文件中的内容合并在一个文件中。

xsd java引用_spring配置文件中xsd引用问题相关推荐

  1. java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解

    Java开发 前言 在Java的日常开发中静态方法引用和实例方法引用在很多地方都会用到,可以说是万金油,但是你真的掌握了吗?下面就由小编给大家做一个比较细想的讲解,废话不多说现在开始把. 正文 大家对 ...

  2. Python 一大坑,配置文件中字典引用问题(拷贝)。

    大坑 +1 python 配置文件中字典引用问题 最近在开发系统时发现一个传奇的BUG, 用户未登录就可进入系统内,而且含有真实身份信息. 此问题困扰多时,反复debug.由于找不到问题原因,复现具有 ...

  3. c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用

    作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...

  4. Java删除properties配置文件中指定键值的代码

    将开发过程较好的一些内容片段记录起来,下面的内容段是关于Java删除properties配置文件中指定键值的内容. public static boolean deleteKeyValue4Pro(S ...

  5. c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...

    首先分两大阵营:C++中引用是一块阵营, C#.Java.Javascript.Python中引用是另一块阵营. 之所以这样分是因为同一阵营中引用使用方法基本一样. C++引用本质是个常量指针,而其他 ...

  6. java如何引用文件_java 中如何引用json文件

    java如何创建Json文件?每次做题前,小编都会先潇洒的写下一个解字,然后开始看题-- 新建json文件放在服务器指定目录下,然后读取和写入信息. 小编是想把讨论世界上最可怕的事情,莫过于有眼睛却发 ...

  7. 取消对 null 指针“l”的引用。_C++中的引用

    当变量声明为引用时,它将成为现有变量的替代名称.通过在声明中添加"&",可以将变量声明为引用. #include using namespace std; int main ...

  8. 使用java程序读取配置文件中的相关属性值-asp.net关注

    在开发企业应用的过程中,碰到很多权限问题,有时候有些权限的代码是要写在配置文件中的,这就需要我们在判断权限的时候,通过相应的程序读取出相关的属性值,程序代码如下. 代码示例: import java. ...

  9. 绝对引用计算机,计算机中绝对引用-excel中的绝对引用有什么用?请解释得通俗一点...

    Excel中的相对引用和绝对引用是怎么操作的? 对列标(ABCD等)和(123等)绝对引用时要加上"$",引用时不用加任何符号. 相对引用和绝对引用是指将公式向右或复制时列标和行号 ...

最新文章

  1. Mysql与Oracle区别
  2. Map集合练习之对字符串中字母出现的次数求和
  3. LNMP 502报错 总结及处理方法
  4. TypeError: 'range' object doesn't support item deletion《机器学习实战》改进的随机梯度上升算法
  5. [JS] 动态修改ckPlayer播放器宽度
  6. PHP如何批量更新MYSQL中的数据
  7. 日志 查看匹配内容的前后几行
  8. linux下的各个语言中stdin,stdout和stderr理解
  9. Python风格总结:循环语句
  10. SQL SERVER 读取 XML 数据
  11. winxp 升级远程连接方法
  12. 硬件电路设计基础知识
  13. H3CIE(WLAN)学习笔记(2)——通信原理基础
  14. 新浪微博爬虫:模拟登陆+爬取原始页面
  15. 画一只会动的皮卡丘(上)
  16. 计算机视觉、图像处理学习资料汇总(转)
  17. 大数定理详解(转载)
  18. C#_____找错误
  19. 微信小程序-选择时间(一周的某一时刻)
  20. 面试中自我介绍的小技巧

热门文章

  1. JavaScript数组包含
  2. 表格中的td内容换行显示
  3. 【CF-817D】Imbalanced Array【单调栈】
  4. 关于windows11下,如何解决不小心把user用户名设置为中文的问题
  5. 10万字XX市开发区智慧综治中心平台建设一期工程招标文件word
  6. mysql查询同年出生的人_查询全体学生的姓名及其出生年份 (数据库)
  7. linux 修改ramdisk内容,修改linux ramdisk大小
  8. 2021北京化工大学计算机学院招生网,北京化工大学2021年硕士研究生招生简章
  9. vscode插件安装介绍
  10. 转:要有独立的判断力,不轻信任何灌输的东西