• spring配置文件中xsd引用问题


    XML的一些概念

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

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

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

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

    1.  
      <?xml version="1.0" encoding="UTF-8"?>
    2.  
      <beans xmlns="http://www.springframework.org/schema/beans/spring-beans.xsd"
    3.  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

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

    1.  
      xsi:schemaLocation="http://www.springframework.org/schema/beans
    2.  
      http://www.springframework.org/schema/beans/spring-beans.xsd
    3.  
      http://www.springframework.org/schema/security
    4.  
      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

    1.  
      http://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
    2.  
      http://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
    3.  
      http://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
    4.  
      http://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
    5.  
      http://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler

    spring.schemas

    1.  
      http://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
    2.  
      http://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
    3.  
      http://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd
    4.  
      http://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd
    5.  
      http://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
    6.  
      ...

    再打开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校验?

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

    1.  
      GenericXmlApplicationContext context = new GenericXmlApplicationContext();
    2.  
      context.setValidating(false);
    </pre><pre code_snippet_id="264875" snippet_file_name="blog_20140330_11_9075882" name="code" class="html" style="border: 1px solid rgb(255, 255, 204); overflow: auto;">
     

    这样可以解决在断网情况下加载xsd文件连接超时的问题。
    schema_reference.4:无法读取方案文档 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd,原因是1)无法找到文档 2)无法读取文档 3)文档的根元素不是<xsd:schema>.
    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/下只能留一份,这时需要将多个文件中的内容合并在一个文件中。

    转自https://blog.csdn.net/dingqinghu/article/details/46758671

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/shizhijie/p/9713342.html
Copyright © 2020-2023  润新知