簡體   English   中英

為什么Spring(4)mvc:default-servlet-handler會覆蓋控制器映射?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM