2013-09-30 66 views
6

我在使用spring mvc 3.2.4.RELEASE实现一个非常简单的页面时遇到了问题。Spring DispatcherServlet:找不到HTTP请求的映射

我的控制器看起来像这样:

@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' 

请告诉我真正weired是一个以前的日志说:

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> 

有谁请给我一个提示什么错在这里去了?

+0

如果您删除'@ Transactional'注释,它是否工作? –

+0

其他控制器是否正常工作或者是您的应用程序中唯一的控制器?您包含的映射日志是否被修剪?它通常显示(至少在Spring 3.1中)它也被映射到的Controller类。 –

+0

请显示您的web.xml和您的上下文路径。 –

回答

7

我认为问题与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

0

我用

<mvc:annotation-driven/> 

这个标签将配置两个bean DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter上面临着同样的问题和解决的问题。

此外我添加标签到我的调度程序servlet配置文件。

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