java - 为什么Spring(4) mvc :default-servlet-handler overrides controller mapping?

标签 java spring-mvc servlets annotations spring-4

我正在启动嵌入式 Tomcat 8 并使用 WebApplicationInitializer 接口(interface)的实现来引导 Spring 应用程序上下文。此实现还向 Tomcat Servlet 上下文添加了一个 DispatcherServlet,我的代码:

@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/*");
}

屁股seen in the spring documentation .

我在某处做:

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 :

@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;
}

}

当我尝试在浏览器中打开就绪​​方法时,它显示 404 Not Found。当我删除 mvc:resources 映射时,它突然起作用了。我尝试向 Controller 添加 Order 注释,并向 mvc:resources 映射添加 order 属性,但它不起作用。

有人见过这个问题的解决方案吗?

我使用:Java8、嵌入式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,它应该强制注册所有必需的处理程序

关于java - 为什么Spring(4) mvc :default-servlet-handler overrides controller mapping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23366238/

相关文章:

java - 使用Html形式将参数传递给java文件

java - Spring RestController提交文件

java - 不同 Web 模块的根上下文

java - 如何将一个类实例传递到另一个类中以便对其进行修改?

Java 如何对 shift 和 & 值进行反混淆?

java - 带有 bean 的 Spring-Core JNDI 配置

java - Spring Boot Hello World 示例不工作

java - 如何诊断 Apache Tomcat 出现 "resource is not available"错误?

java - getElementByClass Jsoup 没有打印任何内容

java - 在struts2 xml中传递特定参数时出现异常