No mapping found for HTTP request with URI [/prjName/contro] in DispatcherServlet with name 'spring'

本文记录了一次Spring MVC配置中遇到的问题及解决过程。主要问题是Tomcat启动后通过URL请求后台时出现PageNotFound错误,原因是spring-servlet.xml和applicationContext.xml未被正确加载。

问题描述:

先说下开发环境和jar包

用的是eclipse : Neon.1a Release , JAVA JDK1.8,JAR包:spring-xxxx.4.3 


spring-servlet.xml

<?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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util 
		http://www.springframework.org/schema/util/spring-util.xsd
		http://www.springframework.org/schema/mvc
        <span style="white-space:pre">	</span>http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd">
	
	<mvc:annotation-driven />
	
	<context:component-scan base-package="com.tjs.trade.about.controller" />
	
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/views/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>

web.xml部分代码

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath*:resources/spring/applicationContext.xml</param-value>
</context-param>
<servlet>
	<servlet-name>spring</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:resources/spring/spring-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>spring</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

问题是:tomcat启动后通过url请求后台:

 org.springframework.web.servlet.PageNotFound noHandlerFound
警告: No mapping found for HTTP request with URI [/prjName/controllerxxx] in DispatcherServlet with name 'spring'


怀疑这里[/prjName/controllerxxx]把prjName也作为controller的requestMapping("")里的参数处理了,它提示没有找到这个映射,但为什么不是提示controllerxxx没找到呢,而把项目名也带上一起映射了,可能是web project setting里项目的命名空间配置成“/”了,这是一种可能


问题找到了,spring-servlet.xml和applicationContext.xml启动的时候根本就没加载

启动没报任何错,记得第一次配置好的时候,这两个文件的路径没设置对,后来设置对了,然后启动没被加载直接过了,我把这两个文件复制到外边,然后把项目里的删了再考进来,没问题了,对!就是备份一下源文件,删了再拷回来就没问题了,我只想说太坑了。。。。。


### Spring MVC DispatcherServlet no mapping found 错误分析与解决 在Spring MVC中,当`DispatcherServlet`无法找到指定URI的映射时,通常会抛出类似以下的错误信息: `No mapping found for HTTP request with URI [/zbb/] in DispatcherServlet with name 'dispatcherServlet'`[^1]。此问题可能由多种原因引起,包括配置错误、请求路径不匹配或控制器方法未正确定义。 以下是可能导致该问题的原因及解决方案: --- #### 1. **检查控制器路径是否正确** 确保控制器类或方法上定义的路径与请求路径一致。例如,如果请求路径为`/zbb/`,则需要在控制器中定义相应的映射: ```java @RestController @RequestMapping("/zbb") public class ZbbController { @GetMapping("/") public String handleRequest() { return "Hello, Zbb!"; } } ``` 上述代码将处理所有以`/zbb/`开头的GET请求[^2]。如果路径不匹配,则会导致`no mapping found`错误。 --- #### 2. **确认`<mvc:annotation-driven />`是否启用** 如果没有启用`<mvc:annotation-driven />`,Spring MVC将无法识别基于注解的控制器映射。请确保在Spring配置文件(如`springmvc-servlet.xml`)中添加以下内容: ```xml <mvc:annotation-driven /> ``` 此配置启用了对`@Controller`和`@RequestMapping`等注解的支持[^2]。缺少此配置可能会导致控制器方法无法被正确解析。 --- #### 3. **检查`DispatcherServlet`的拦截规则** `DispatcherServlet`的拦截规则通常在`web.xml`中定义。例如: ```xml <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 上述配置表示`DispatcherServlet`将拦截所有以`/`开头的请求[^3]。如果`<url-pattern>`设置为`*.do`或其他特定后缀,则`/zbb/`请求可能不会被拦截,从而导致`no mapping found`错误。 --- #### 4. **静态资源干扰** 如果`DispatcherServlet`拦截了所有请求,但未正确配置静态资源处理规则,则可能导致静态资源请求也被拦截并报错。例如,主页轮播图资源未加载的问题[^4]。可以通过以下方式解决: - 在Spring配置文件中添加`<mvc:default-servlet-handler />`: ```xml <mvc:default-servlet-handler /> ``` - 或者在`web.xml`中为静态资源添加单独的映射规则: ```xml <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping> ``` --- #### 5. **检查上下文加载路径** 确保`DispatcherServlet`能够正确加载Spring配置文件。例如,在`web.xml`中通过`contextConfigLocation`参数指定配置文件路径: ```xml <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> ``` 如果路径错误或配置文件缺失,则可能导致控制器无法注册到`DispatcherServlet`中。 --- #### 6. **调试与日志分析** 启用Spring MVC的日志功能,查看详细的请求处理流程。可以在`log4j.properties`或`application.properties`中添加以下配置: ```properties logging.level.org.springframework.web=DEBUG ``` 通过日志可以确认请求是否到达`DispatcherServlet`,以及具体的映射查找过程[^1]。 --- ### 示例代码 以下是一个完整的Spring MVC配置示例,用于处理`/zbb/`请求: ```java // 控制器类 @RestController @RequestMapping("/zbb") public class ZbbController { @GetMapping("/") public String handleZbbRequest() { return "Welcome to /zbb/"; } } // web.xml 配置 <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> // springmvc-servlet.xml 配置 <mvc:annotation-driven /> <mvc:default-servlet-handler /> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值