You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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类型,就会抛出这个异常。

具体修复步骤:

  1. 排查依赖冲突
    运行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>
      
  2. 统一Spring版本
    你的pom.xml已经用${spring.version}统一管理了Spring版本,确保所有Spring相关依赖都使用这个变量,不要手动指定其他版本。

  3. 清理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

火山引擎 最新活动