【问题标题】:Spring DispatcherServlet: No mapping found for HTTP requestSpring DispatcherServlet:未找到 HTTP 请求的映射
【发布时间】:2013-09-30 16:14:50
【问题描述】:

我在使用 spring mvc 3.2.4.RELEASE 实现一个非常简单的页面时遇到问题。

我的控制器如下所示:

@Transactional
@Controller
public class MembersDetailsController {
    @Autowired
    private MemberService memberService;

    @RequestMapping(value = "/member/{name}", method = RequestMethod.GET)
    public String displayMember(@PathVariable String name) {
        System.out.println(name);
        return "member";
    }

    @RequestMapping(value = "/member", method = RequestMethod.GET)
    public String displayMember() {
        System.out.println("Empty");
        return "member";
    }
}

当我打电话时

http://127.0.0.1:8080/member

正在按需要执行相应的方法。但是,我打电话给

http://127.0.0.1:8080/member/test

http://127.0.0.1:8080/member/test/

我得到一个带有日志输出的 404:

WARN  org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/member/test] in DispatcherServlet with name 'mvc-dispatcher'

真正奇怪的是之前的日志说:

INFO  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/member/{name}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String 
INFO  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/member],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String

这意味着据我所知映射应该是正确的。

这是我的 web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!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>
    <display-name>Mitgliederdatenbank</display-name>

    <!--Configuration-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-security.xml, /WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>sessionFactoryBeanName</param-name>
            <param-value>hibernateSessionFactory</param-value>
        </init-param>
    </filter>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <!--Spring Security Filter-->
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

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

    <!-- Servlets -->
    <servlet>
        <servlet-name>springGwtRemoteServiceServlet</servlet-name>
        <servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <!-- Mapping -->
    <servlet-mapping>
        <servlet-name>springGwtRemoteServiceServlet</servlet-name>
        <url-pattern>/ui/springGwtServices/*</url-pattern>
    </servlet-mapping>

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

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

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

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

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/member/*</url-pattern>
    </servlet-mapping>

    <!-- Default page to serve -->
  <welcome-file-list>
    <welcome-file>/login</welcome-file>
  </welcome-file-list>

</web-app>

谁能告诉我这里出了什么问题?

【问题讨论】:

  • 去掉@Transactional注解还能用吗?
  • 其他控制器是否正常工作,或者这是您应用中唯一的控制器?你所包含的映射日志,它被修剪了吗?它通常也会显示(至少在 Spring 3.1 中)它映射到的 Controller 类。
  • 请显示您的 web.xml 和您的上下文路径。
  • 删除@Transactional 注释不会改变任何东西。我将 web.xml 添加到描述中。
  • 其他控制器工作正常。

标签: java spring spring-mvc


【解决方案1】:

我相信问题与此处描述的问题相同URL Mapping issue - Spring web MVC

除非您使用 alwaysUseFullPath,否则 spring mvc 会将 * 部分匹配到您指定的映射(例如 /member/member/test )。请参阅此处的 alwaysUseFullPath 文档(第 17.4 节)http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html

但是,不幸的是,此属性不会通过 xml 配置元素公开(如果您使用的是 xml 配置),因此如果您希望映射按照您在问题中描述的方式工作,您需要将其配置为此处描述:http://blog.sarathonline.com/2013/07/enable-alwaysusefullpath-with.html

【讨论】:

    【解决方案2】:

    我遇到了同样的问题并通过使用解决了问题

    <mvc:annotation-driven/>
    

    这个标签会配置两个bean DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter。

    我还在调度程序 servlet 配置文件中添加了标签。

    <context:component-scan base-package="PATH WHERE FIND CONTROLLERS" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 2017-02-12
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2013-11-19
      • 2019-03-25
      相关资源
      最近更新 更多