【问题标题】:Spring 4 No mapping found for HTTP requestSpring 4 找不到 HTTP 请求的映射
【发布时间】:2014-03-11 17:45:25
【问题描述】:

我正在运行 Spring 4,并且正在尝试构建一个非常基本的 REST Web 服务作为概念证明。这是我的 web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app id="poc" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>ws</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/ws-servlet.xml</param-value>
    </context-param>

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

这是我的应用程序上下文中我的 servlet 的定义:

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

<bean name="/rememberName" class="com.corrisoft.air.ws.RememberNameController" init-method="init">
    <property name="personService" ref="personService"/>
</bean>

以下是我从 Spring 收到的消息:

INFO: Mapped URL path [/rememberName] onto handler '/rememberName'
....
WARNING: No mapping found for HTTP request with URI [/springpoc/ws/rememberName] in DispatcherServlet with name 'ws'

其中 springpoc 是我在 tomcat 下部署的 war 文件的名称。 RememberNameController 直接扩展 HttpServlet。

谁能告诉我我的映射做错了什么?

【问题讨论】:

  • 请也分享 applicationContext.xml 以便我们查看您拥有哪些视图解析器以及它们是如何配置的。
  • 按您的要求添加了应用程序上下文。
  • 我认为这是在抱怨您没有将其绑定到正确的 url。您可以使用类似 localhost:8080/springpoc/rememberName 的方式调用它,或者如果您进行了我在下面建议的更改,则 localhost:8080/springpoc/ws/rememberName

标签: java spring tomcat spring-mvc


【解决方案1】:

我认为是这样的:

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

必须是这样的:

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

【讨论】:

    【解决方案2】:

    我认为问题在于您将打算成为 Spring 控制器的内容与普通 Servlet 混合在一起。 Spring Controllers 不是 Servlet,它们是 Spring MVC 用于处理请求的常规 POJO(由 Dispatcher Servlet 调用)

    如果您想了解使用 Spring 4 创建 REST 服务的现代方式,请查看this guide

    【讨论】:

      【解决方案3】:

      Spring 控制器不应扩展 HttpServlet,它们应使用 Spring 注释构建。例如

      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      @Controller
      public class HelloWorldController {
      
          @RequestMapping("/hello")
          public String hello() {
              return "helloworld";
          }
      }
      

      详情请看以下教程http://javahash.com/spring-4-mvc-hello-world-tutorial-full-example/

      【讨论】:

      • 我知道他们展示了很多。你如何以这种方式使用你的 XML 文件构建你的控制器?
      • 我在我的 Spring 应用程序中做了这个。您不需要在 XML 文件中做任何事情。 DispatcherServlet 自动将请求映射到您的 POJO。春天真好。
      • 如果你真的想在XML中配置请求映射,这里有一个例子stackoverflow.com/questions/4481373/requestmapping-in-xml
      • 基本上,这些人的意思是,如果您使用 DispatcherServlet,则不要对其进行子类化。您像之前一样在 xml 文件中声明它,然后创建一个带有 Controller 注释和 RequestMapping 的对象(用于类或特定方法)。正如我所说,它是魔法。
      • @TheThom 请参阅我发布到 cmets 的链接,了解如何将控制器与 XML 连接在一起。但是控制器仍然不应该扩展 HttpServlet。如果您直接编写 servlet,则不需要 Spring。
      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多