前言
本篇文章的来源是遇到的一个奇葩的问题,springmvc 部署之后,出现“匹配的通配符很全面,但无法找到元素 mvc:annotation-driven 的声明”这一错误问题,但是按照网上很多人说的,是 applicationContext 中缺少 mvc xsd 的声明和对应信息,但我遇到的显然不是这个问题,我的配置文件里有 mvc xsd 的声明,经过半天折腾,终于解决了,这里来记录一下。
1. 错误重现
我们来看下是什么样的配置下出现了这个问题:
如图,这就是我的配置了,一眼看过去上下是能对应上的,但是为什么还会出现这个错误?令人百思不得其解,最后经过仔细观察,我们发现了一个问题,为什么 spring-context.xsd 和 spring-mvc.xsd 是 https ?
2. 解决问题
我们是在内网出现的这个问题的,外网并没有这个问题,这就有点魔性了,所以当我们试着把那两个 https 改为 http 以后,内网居然可以运行了。
附上我们修改之后的正确版本:
<?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: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">
<mvc:annotation-driven/>
3. 一些思考
首先声明我们内网和外网都是 http 模式。这次问题也引发我们的思考,xsd 文件最后应该是从 jar 包中进行访问的,当我们在外网的时候,如果本地访问不到这个 xsd,那么就会联网去 https 下载这个 xsd ,而我们的内网不能上网,所以才会报错,于是当我们改为 http 以后,本地的 jar 包中就包含有这个 xsd 的信息,于是就成功运行了。