[英]Why Spring(4) mvc:default-servlet-handler overrides controller mapping?
我正在啟動嵌入式Tomcat 8,並使用WebApplicationInitializer接口的實現引導彈簧應用程序上下文。 此實現還將一個DispatcherServlet添加到Tomcat Servlet Context中,我的代碼是:
@Override
public void onStartup(final ServletContext servletContext) throws ServletException
{
final XmlWebApplicationContext dispatcherContext = new XmlWebApplicationContext();
dispatcherContext.setConfigLocation("/path/to/context/defintion.xml");
// Register and map the dispatcher servlet
final ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.addMapping("/test/*");
}
彈簧文檔中看到的屁股。
我在某個地方:
Tomcat t = new Tomcat()
// ... some config ...
t.start()
然后觸發上面看到的方法。 工作正常。
上下文定義如下所示:
<!-- annotation config -->
<context:annotation-config/>
<!-- scan for controllers -->
<context:component-scan base-package="com.samples.controller"/>
<!-- static resources -->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
我的控制器:
@Controller
// @Order(value = 1)
public class ReadyController
{
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView ready(final HttpServletRequest request, final HttpServletResponse
response)
{
try
{
response.getWriter().print("Ready!");
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}
當我嘗試在瀏覽器中打開ready方法時,顯示“ 404 Not Found”。 當我刪除 mvc:resources映射時,它突然消失了 。 我試圖將Order注釋添加到控制器,還將order屬性添加到mvc:resources映射,但沒有成功。
有人看到了解決方案嗎?
我曾經使用過:Java8,Embeddded Tomcat8,Spring4
編輯 :添加了日志文件輸出
這是在上下文中添加了mvc:resources標記的日志輸出:
2014-04-29 15:41:31 DEBUG DispatcherServlet:838 - DispatcherServlet with name 'dispatcher' processing GET request for [/test]
2014-04-29 15:41:31 TRACE DispatcherServlet:1091 - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@3cf4de47] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:41:31 TRACE BeanNameUrlHandlerMapping:127 - No handler mapping found for [/test]
2014-04-29 15:41:31 TRACE DispatcherServlet:1091 - Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@5f1fb0ba] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:41:31 TRACE SimpleUrlHandlerMapping:127 - No handler mapping found for [/test]
2014-04-29 15:41:31 TRACE DispatcherServlet:1091 - Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@29f2754] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:41:31 TRACE SimpleUrlHandlerMapping:127 - No handler mapping found for [/test]
2014-04-29 15:41:31 WARN PageNotFound:1110 - No mapping found for HTTP request with URI [/test] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:41:31 TRACE DispatcherServlet:1053 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@2bc277d6
2014-04-29 15:41:31 DEBUG DispatcherServlet:991 - Successfully completed request
2014-04-29 15:41:31 TRACE XmlWebApplicationContext:331 - Publishing event in WebApplicationContext for namespace 'dispatcher-servlet': ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[1ms]; status=[OK]
2014-04-29 15:41:31 TRACE XmlWebApplicationContext:331 - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[1ms]; status=[OK]
2014-04-29 15:41:31 TRACE ClassPathXmlApplicationContext:331 - Publishing event in org.springframework.context.support.ClassPathXmlApplicationContext@3c130745: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[1ms]; status=[OK]
2014-04-29 15:41:31 TRACE StaticApplicationContext:331 - Publishing event in org.springframework.context.support.StaticApplicationContext@63440df3: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[1ms]; status=[OK]
如果我從上下文文件中刪除mvc:resources標簽,則reuqest可以正常工作,並且日志輸出如下所示:
2014-04-29 15:42:31 TRACE DispatcherServlet:1043 - Bound request context to thread: org.apache.catalina.connector.RequestFacade@1f28ea73
2014-04-29 15:42:31 DEBUG DispatcherServlet:838 - DispatcherServlet with name 'dispatcher' processing GET request for [/test]
2014-04-29 15:42:31 TRACE DispatcherServlet:1091 - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@1820ce89] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:42:31 TRACE BeanNameUrlHandlerMapping:127 - No handler mapping found for [/test]
2014-04-29 15:42:31 TRACE DispatcherServlet:1091 - Testing handler map [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping@7753d076] in DispatcherServlet with name 'dispatcher'
2014-04-29 15:42:31 DEBUG DefaultAnnotationHandlerMapping:124 - Mapping [/test] to HandlerExecutionChain with handler [com.samples.controller.ReadyController@5ce05166] and 1 interceptor
2014-04-29 15:42:31 TRACE DispatcherServlet:1131 - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@303e6671]
2014-04-29 15:42:31 TRACE DispatcherServlet:1131 - Testing handler adapter [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@75da797a]
2014-04-29 15:42:31 TRACE DispatcherServlet:1131 - Testing handler adapter [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter@384cb80]
2014-04-29 15:42:31 DEBUG DispatcherServlet:925 - Last-Modified value for [/test] is: -1
2014-04-29 15:42:31 DEBUG HandlerMethodInvoker:172 - Invoking request handler method: public void com.samples.controller.ReadyController.ready(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2014-04-29 15:42:31 DEBUG DispatcherServlet:1012 - Null ModelAndView returned to DispatcherServlet with name 'dispatcher': assuming HandlerAdapter completed request handling
2014-04-29 15:42:31 TRACE DispatcherServlet:1053 - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@1f28ea73
2014-04-29 15:42:31 DEBUG DispatcherServlet:991 - Successfully completed request
2014-04-29 15:42:31 TRACE XmlWebApplicationContext:331 - Publishing event in WebApplicationContext for namespace 'dispatcher-servlet': ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[2ms]; status=[OK]
2014-04-29 15:42:31 TRACE XmlWebApplicationContext:331 - Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[2ms]; status=[OK]
2014-04-29 15:42:31 TRACE ClassPathXmlApplicationContext:331 - Publishing event in org.springframework.context.support.ClassPathXmlApplicationContext@353d0772: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[2ms]; status=[OK]
2014-04-29 15:42:31 TRACE StaticApplicationContext:331 - Publishing event in org.springframework.context.support.StaticApplicationContext@7113b13f: ServletRequestHandledEvent: url=[/test]; client=[0:0:0:0:0:0:0:1]; method=[GET]; servlet=[dispatcher]; session=[null]; user=[null]; time=[2ms]; status=[OK]
編輯:如果我刪除了mvc:resources標記,而是使用了mvc:default-servlet-handler標記,我得到相同的結果,則請求無法正常工作。
stackoverflow.com/q/7910845/2231632-我相信這可能會有所幫助。
在此處復制答案:嘗試將<mvc:annotation-driven />
到您的上下文中。 覆蓋spring mvc的默認行為。 如果將<mvc:annotation-driven />
到spring-servlet.xml,則它應強制注冊所有必需的處理程序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.