没有找到带有 URI Spring MVC 的 HTTP 请求的映射 [重复]

Posted

技术标签:

【中文标题】没有找到带有 URI Spring MVC 的 HTTP 请求的映射 [重复]【英文标题】:No mapping found for HTTP request with URI Spring MVC [duplicate] 【发布时间】:2013-07-27 16:38:57 【问题描述】:

这是我的 Web.xml

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/servlet-context.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

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

我的 servlet-context.xml

<context:component-scan base-package="com.springexample.controller.impl" />
    <mvc:annotation-driven />

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

最后是 Handler 类。这是在 com.springexample.controller.impl

@Controller
public class IndexControllerImpl implements IndexController 

    @RequestMapping("/")
    public String index() 

        return "index";
    

不过要去localhost:8080/projectname/

它返回一个 404 错误。

Jul 27, 2013 8:18:31 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/tasklist/WEB-INF/views/index.jsp] in DispatcherServlet with name 'dispatcherServlet'
Jul 27, 2013 8:18:37 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/tasklist/index] in DispatcherServlet with name '

这是我的项目结构

【问题讨论】:

你期望这个:/tasklist/WEB-INF/views/index.jsp 命中? 试试@RequestMapping(value="/") @TheNewIdiot 应该是视图。 /WEB-INF/views/下有index.jsp吗? @donatello 像 GET 和 POST 是仅有的两种可用的请求方法 ;) 真的没关系。省略 RequestMethod 参数意味着它将占用所有参数(GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE)。 【参考方案1】:

按照您在问题中的方式配置 web.xml,特别是:

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

向您的网络应用发出的所有请求都将被定向到DispatcherServlet。这包括像/tasklist//tasklist/some-thing.html/tasklist/WEB-INF/views/index.jsp 这样的请求。

因此,当您的控制器返回一个指向.jsp 的视图时,DispatcherServlet 不会允许您的服务器容器为请求提供服务,而是会跳入并开始寻找可以为该请求提供服务的控制器,它没有找到任何东西,因此没有找到 404

最简单的解决方法是让你的 servlet url 映射如下:

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

请注意缺少的*。这告诉容器任何没有path info 的请求(最后没有.xxx 的url)都应该发送到DispatcherServlet。使用此配置,当收到xxx.jsp 请求时,不会咨询DispatcherServlet,并且您的servlet 容器的默认servlet 将为该请求提供服务并按预期呈现jsp。

希望这会有所帮助,我意识到您之前的 cmets 声明问题已解决,但解决方案不能只是将 method=RequestMethod.GET 添加到 RequestMethod

【讨论】:

我认为 Spring 的文档是造成这种混乱的部分原因。他们使用此 web.xml 片段 &lt;servlet-mapping&gt; &lt;servlet-name&gt;example&lt;/servlet-name&gt; &lt;url-pattern&gt;/example/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; 作为示例,没有任何警告表明如果未仔细配置 servlet 映射,已解析的视图可能会再次返回到调度程序。大多数人只会删除example 部分,这就是他们遇到这个奇怪问题的原因。 你是神,我不是,我只是觉得你应该知道。 你太客气了@asteri 如果我希望 .json 由调度程序 servlet 提供服务怎么办。我必须明确映射 url 模式吗? @TharinduVishwanath 是的,如果您希望 .json 请求由调度程序 servlet 提供服务,您将需要一个 url 模式【参考方案2】:

我添加了包含 context.xml 的 META-INF 文件夹

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/SpringGradleDemo"/>

SpringGradleDemo 是我的项目名称,它可以工作。 我的 servlet 映射是“/” 我在这里读到了https://tomcat.apache.org/tomcat-5.5-doc/config/context.html

【讨论】:

【参考方案3】:
<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

改为:

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

【讨论】:

【参考方案4】:

我也有同样的问题...... 我更改了我的项目名称,我遇到了这个问题...我的解决方案是检查项目引用并在我的 web.xml 中使用/(而不是/*

【讨论】:

【参考方案5】:

尝试在 index 方法中传递 Model 对象,它会起作用 -

@RequestMapping("/")

public String index(org.springframework.ui.Model model) 

 return "index";

    

实际上spring容器在映射方法中寻找一个Model对象。如果它找到相同的,它会将返回的字符串作为视图传递给视图解析器。

希望这会有所帮助。

【讨论】:

【参考方案6】:
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

嘿,请在您的 web.xml 中使用 /(而不是 /*)

【讨论】:

【参考方案7】:

首先检查您的 [PROJECT_NAME]\target\classes 目录中的 java 类是否已编译。

如果不是,您的 java 类中有一些编译错误。

【讨论】:

虽然编译的类没有必要在目标文件夹中(除非你使用的是 maven),但是感谢您的提示!!

以上是关于没有找到带有 URI Spring MVC 的 HTTP 请求的映射 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 控制器问题:找不到带有 URI 的 HTTP 请求的映射

Spring:没有为带有 URI 的 HTTP 请求找到映射

如何将 Spring MVC 控制器映射到带有和不带有斜杠的 uri?

Spring 4 MVC,警告:在 DispatcherServlet 中找不到带有 URI 的 HTTP 请求的映射,名称为 [...] 和 HTTP 404 错误

spring mvc工作流程

Thymeleaf (Java Spring):无法让 mvc.uri 工作