2013-09-30 73 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" /> 
相關問題