Spring DispatcherServlet:找不到HTTP请求的映射

时间:2013-09-30 16:14:51

标签: java spring spring-mvc

我在使用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>

有人可以告诉我这里出了什么问题吗?

2 个答案:

答案 0 :(得分:7)

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

除非你使用alwaysUseFullPath,否则spring mvc会将* part与你指定的映射匹配(例如/ 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

答案 1 :(得分:0)

我遇到了同样的问题并使用

解决了问题
<mvc:annotation-driven/>

此标记将配置两个bean DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。

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

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