1.问题描述
springmvn项目里面的配置文件对应的xsd下载不到或者在本地jar包找不到,此时项目启动时会抛出异常:
SEVERE [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Servlet.init() for servlet [SpringMVC] threw exception
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 20 in XML document from class path resource [spring/spring-mvc.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 20; columnNumber: 28; cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:annotation-driven'.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:399)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
大致意思是验证某些标签出错了。
这个问题出错的原因有如下几方面:
- 标签确实写错了
- spring配置文件中最上面配置的xmlns地址无法访问到,比如本地断网情况下
- spring配置文件中最上面配置的xsd文件带有版本号,这个版本号的文件在本地spring的jar包中找不到,比如使用了springmvc4.1的版本,配置文件中配置了4.3的版本:
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
以上三种情况下,第一种很少,最容易解决。第二种spring本身考虑了这个问题,默认先从本地jar包中寻找对应的版本,如果不指定版本则寻找最新的,如果指定版本则寻找指定版本,如果找不到则去xmlns指定的地址去寻找。如果也访问不到就抛异常。
我的工程出现了第三种情况,配置的版本号太高,使用的jar包版本稍微有些低,导致xsd在本地无法找到,同时spring官网的地址又把本地ip给屏蔽了 导致无法访问到。
解决方式
最终的解决方式就是去掉版本,让spring默认从本地寻找最高的版本号:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>