Why does Spring MVC respond with a 404 and report “No mapping found for HTTP request with URI […] in DispatcherServlet”?
我正在编写一个部署在Tomcat上的SpringMVC应用程序。请参阅以下最小、完整和可验证的示例
1 2 3 4 5 6 7 8 9 10 11 | public class Application extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { }; } protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { SpringServletConfig.class }; } protected String[] getServletMappings() { return new String[] {"/*" }; } } |
其中
1 2 3 4 5 6 7 8 9 10 11 12 | @Configuration @ComponentScan("com.example.controllers") @EnableWebMvc public class SpringServletConfig { @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver vr = new InternalResourceViewResolver(); vr.setPrefix("/WEB-INF/jsps/"); vr.setSuffix(".jsp"); return vr; } } |
最后,我有一个
1 2 3 4 5 6 7 | @Controller public class ExampleController { @RequestMapping(path ="/home", method = RequestMethod.GET) public String example() { return"index"; } } |
我的应用程序的上下文名称是
1 | http://localhost:8080/Example/home |
应用程序以HTTP状态404响应,并记录以下内容
1 | WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI `[/Example/WEB-INF/jsps/index.jsp]` in `DispatcherServlet` with name 'dispatcher' |
我在
这是关于此警告消息的问题的标准帖子。
您的标准SpringMVC应用程序将通过您在servlet容器中注册的
可以说是最重要的,
incoming requests to handlers and a list of pre- and post-processors
(handler interceptors) based on some criteria the details of which
vary byHandlerMapping implementation. The most popular implementation
supports annotated controllers but other implementations exists as
well.Ok.
No mapping found for HTTP request with URI
[/some/path] inDispatcherServlet with name SomeNameOk.
或者抛出一个
最常见的
正如上面的链接所描述的,这两种方法都将注册一个
如果您收到警告消息和404,并且正确配置了以上所有内容,那么您将向错误的URI发送请求,该URI不是由检测到的
从URL到名称以斜杠("/")开头的bean好的。< /块引用>
你也可以自己写。显然,您必须确保发送的请求至少与注册的
如果您没有隐式或显式注册任何
SpringMVC将记录通过
1 2 3 4 5 6 7 | @Controller public class ExampleController { @RequestMapping(path ="/example", method = RequestMethod.GET, headers ="X-Custom") public String example() { return"example-view-name"; } } |
将在信息级别记录以下内容好的。
1 | Mapped"{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example() |
这描述了注册的映射。当您看到没有找到处理程序的警告时,请将消息中的URI与此处列出的映射进行比较。
其他
同样,在调试级别启用Spring日志记录以查看哪些beans Spring寄存器。它应该报告它找到的注释类、它扫描的包以及它初始化的bean。如果您期望的配置不存在,请检查您的
一个EDCOX1的4度是一个典型的JavaEE EDCOX1(16)。您可以在典型的
- 如何使用web.xml中的servlet URL映射?
有鉴于此,一个常见的错误是使用
1 2 3 4 | @RequestMapping(path ="/example", method = RequestMethod.GET) public String example() { return"example-view-name"; } |
带一个
1 2 3 4 5 6 7 | @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver vr = new InternalResourceViewResolver(); vr.setPrefix("/WEB-INF/jsps/"); vr.setSuffix(".jsp"); return vr; } |
您可能希望将请求转发到路径
No mapping found for HTTP request with URI
[/Example/WEB-INF/jsps/example-view-name.jsp] inDispatcherServlet with name 'dispatcher'Ok.
由于
相反,在这种简单的情况下,您应该将
这就是您在示例中看到的。好的。好啊。
除了前面描述的问题外,我还解决了我的问题:`
1 2 3 4 5 6 7 | @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver vr = new InternalResourceViewResolver(); vr.setPrefix("/WEB-INF/jsps/"); vr.setSuffix(".jsp"); return vr; } |
1 2 3 4 5 | <dependency> <groupId>org.apache.tomcat.embed</groupId> tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> |
`源:jsp文件未在Spring引导Web应用程序中呈现
在我的例子中,我遵循5.1.2版的拦截器Spring文档(在使用Spring Boot v2.0.4.release时),并且
在尝试了很多不同的事情之后,我尝试移除
编辑:这是参考文档,说明您应该删除
显然,至少在我的案例中,我已经在配置我的Spring应用程序(虽然不是通过使用
对于我来说,我发现我的目标类是在一个与源代码不同的文件夹模式中生成的。这可能是在Eclipse中,我添加了包含控制器的文件夹,而不是作为包添加它们。所以我最终在Spring配置中定义了错误的路径。
我的目标类是在app下生成类,我指的是com.happy.app。
1 2 3 | <context:annotation-config /> <context:component-scan base-package="com.happy.app"></context:component-scan> |
我为com.happy.app添加了包(不是文件夹),并在Eclipse中将文件从文件夹移动到包中,解决了这个问题。
我遇到了同样错误的另一个原因。这也可能是由于没有为controller.java文件生成类文件。因此,web.xml中提到的调度程序servlet无法将其映射到控制器类中的适当方法。
1 2 3 4 5 6 | @Controller Class Controller{ @RequestMapping(value="/abc.html")//abc is the requesting page public void method() {.....} } |
在Eclipse的project->clean->build project下,检查是否为工作区builds下的控制器文件生成了类文件。
清理服务器。可能删除服务器并再次添加项目并运行。
停止Tomcat服务器
右键单击服务器并选择"清理"
再次右键单击服务器并选择"清理Tomcat工作目录"