Spring MVC配置异常咨询:文件找不到与方法不存在问题排查
咱们一步步拆解你遇到的两个问题,逐个解决:
一、先解决配置文件找不到的问题:java.io.FileNotFoundException: class path resource [WEB-INF/dispatcher-servlet.xml]
你一开始把dispatcher-servlet.xml放在webapp/WEB-INF下是正确的位置,出现找不到的问题,大概率是web.xml里的DispatcherServlet配置有问题:
- 如果你没给DispatcherServlet指定
contextConfigLocation参数,它默认会去webapp/WEB-INF目录下找[你的servlet名称]-servlet.xml(比如你的servlet叫dispatcher,就找dispatcher-servlet.xml),这个路径是相对于web应用根目录,不是classpath,所以不需要加classpath:前缀。 - 如果你手动指定了
contextConfigLocation,一定要确保路径是/WEB-INF/dispatcher-servlet.xml,而不是classpath:/WEB-INF/dispatcher-servlet.xml——因为webapp/WEB-INF不在classpath范围内(classpath默认是src/main/resources和编译后的target/classes)。
正确的web.xml配置示例:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 下面这个init-param可以省略,省略时自动加载/WEB-INF/dispatcher-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
所以先把dispatcher-servlet.xml放回webapp/WEB-INF,再检查web.xml的配置是否正确。
二、解决方法不存在的错误:java.lang.NoSuchMethodError: org.springframework.beans.MutablePropertyValues.add(...)
这个错误是典型的依赖版本冲突:Spring 3.x里的MutablePropertyValues.add()方法是链式调用,会返回自身(MutablePropertyValues类型),但如果你的classpath里混入了Spring 2.x的spring-beans包,旧版本的这个方法是void类型,就会抛出这个异常。
具体修复步骤:
排查依赖冲突
运行mvn dependency:tree命令,查看所有依赖的树状结构,找有没有引入spring-beans的旧版本。从你的pom.xml来看,有两个潜在风险点:net.sf.json-lib:json-lib:2.0:这个旧版本可能依赖Spring 2.x,建议升级到2.4版本(并指定jdk15分类器),同时排除它的Spring依赖:<dependency> <groupId>net.sf</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>org.jboss.resteasy:resteasy-jaxrs:2.1.0.GA:这个版本也可能引入旧Spring,同样添加排除:<dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>2.1.0.GA</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency>
统一Spring版本
你的pom.xml已经用${spring.version}统一管理了Spring版本,确保所有Spring相关依赖都使用这个变量,不要手动指定其他版本。清理Maven缓存
运行mvn clean install -U,强制更新依赖并清理本地仓库中可能存在的冲突jar包。
额外的配置优化建议
从你的dispatcher-servlet.xml来看,Spring MVC的schema版本不一致:
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"
建议把spring-mvc的schema也升级到3.1版本,保持版本一致:
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
内容的提问来源于stack exchange,提问作者kinnu




