java - Spring MVC 无法处理来自资源处理程序的 404?

标签 java spring spring-mvc

我正在使用 Spring MVC 4.3.11.RELEASE 并且有一个用于静态资源的原始资源处理程序。它工作正常 - 对于存在的资源。但是,如果没有,它似乎会向 DispatcherServlet 返回 404,DispatcherServlet 对响应感到满意,因为它找到了处理程序。我有 NoHandlerFoundException 的 ControllerAdvice,它适用于 Controller 但并不意味着处理这种情况。所以 Spring MVC 完全放弃了,我得到了令人讨厌的 Tomcat 404 响应。我找不到为这种情况配置处理的方法,因此我无法返回正确的响应。

为 Spring 启用 TRACE 后,您会看到此类请求的以下内容:

2018-03-15T14:22:05,361 TRACE [] DispatcherServlet          - Bound request context to thread: org.apache.catalina.connector.RequestFacade@597aa896
2018-03-15T14:22:05,361 DEBUG [] DispatcherServlet          - DispatcherServlet with name 'dispatcher' processing GET request for [/creditcard/static/doh]
2018-03-15T14:22:05,361 TRACE [] DispatcherServlet          - Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@4b720a14] in DispatcherServlet with name 'dispatcher'
2018-03-15T14:22:05,361 DEBUG [] questMappingHandlerMapping - Looking up handler method for path /static/doh
2018-03-15T14:22:05,364 DEBUG [] questMappingHandlerMapping - Did not find handler method for [/static/doh]
2018-03-15T14:22:05,364 TRACE [] DispatcherServlet          - Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@67db7dde] in DispatcherServlet with name 'dispatcher'
2018-03-15T14:22:05,364 TRACE [] BeanNameUrlHandlerMapping  - No handler mapping found for [/static/doh]
2018-03-15T14:22:05,364 TRACE [] DispatcherServlet          - Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@4698270f] in DispatcherServlet with name 'dispatcher'
2018-03-15T14:22:05,364 DEBUG [] SimpleUrlHandlerMapping    - Matching patterns for request [/static/doh] are [/static//**]
2018-03-15T14:22:05,364 DEBUG [] SimpleUrlHandlerMapping    - URI Template variables for request [/static/doh] are {}
2018-03-15T14:22:05,364 DEBUG [] SimpleUrlHandlerMapping    - Mapping [/static/doh] to HandlerExecutionChain with handler [ResourceHttpRequestHandler [locations=[ServletContext resource [/static//]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@20537c7e]]] and 1 interceptor
2018-03-15T14:22:05,364 TRACE [] DispatcherServlet          - Testing handler adapter [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter@442b38d3]
2018-03-15T14:22:05,364 TRACE [] DispatcherServlet          - Testing handler adapter [org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter@3128c8a7]
2018-03-15T14:22:05,364 DEBUG [] DispatcherServlet          - Last-Modified value for [/creditcard/static/doh] is: -1
2018-03-15T14:22:05,364 TRACE [] ResourceHttpRequestHandler - Applying "invalid path" checks to path: doh
2018-03-15T14:22:05,364 TRACE [] PathResourceResolver       - Resolving resource for request path "doh"
2018-03-15T14:22:05,364 TRACE [] PathResourceResolver       - Checking location: ServletContext resource [/static//]
2018-03-15T14:22:05,364 TRACE [] PathResourceResolver       - No match for location: ServletContext resource [/static//]
2018-03-15T14:22:05,364 TRACE [] ResourceHttpRequestHandler - No matching resource found - returning 404
2018-03-15T14:22:05,364 DEBUG [] DispatcherServlet          - Null ModelAndView returned to DispatcherServlet with name 'dispatcher': assuming HandlerAdapter completed request handling
2018-03-15T14:22:05,364 TRACE [] DispatcherServlet          - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@597aa896
2018-03-15T14:22:05,364 DEBUG [] DispatcherServlet          - Successfully completed request

想法?

最佳答案

我遇到了同样的问题。我的解决方案如下:

  • spring.resources.add-mappings=false(在 yaml 或 application.properties 中)
  • 在 WebMvcConfigurer 的“addResourceHandlers”方法的配置中添加所有映射,例如:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/home.html**")
                    .addResourceLocations("classpath:/static/views/home/");
        }
    
        @Override
        public void configureDefaultServletHandling(
                  DefaultServletHandlerConfigurer configurer) {
            // DO not enable this ! 
            // configurer.enable();
            // Remove this method! 
        }
    }
    
  • 必须删除默认的 servlet 处理程序,因为它将尝试处理并返回状态 404,但绝不会抛出 NoHandlerFoundException

  • 添加 GlobalExceptionHandler Controller 建议:

    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(NoHandlerFoundException.class)
        public String handleNotFoundError(Exception ex) {
            return "redirect:/your404page";
        }
    }
    

希望对您有所帮助!对我来说它完美无缺!

关于java - Spring MVC 无法处理来自资源处理程序的 404?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302130/

相关文章:

java - 如何测试 SQLiteDatabase 查询中的光标是否为空

java - 使用 lambda 函数进行 REST API 调用的 Junit 测试用例

java - JUnit+Mockito 或 RestAssured

java - Portlet JSR286 如何调用 Websphere 6 上不同 war 中发现的 portlet

java - Spring MVC 将值列表从 JSP 页面传递到 Controller

user-interface - 我需要一个Java反编译器

java - 使用原始值填充表单的验证失败文件输入字段以便其可以显示在 JSP 文件中的正确方法是什么?

java - 如何模拟带有客户端或服务器错误的 RestTemplate?

java - 方法抛出 'org.hibernate.LazyInitializationException' 异常

java - 从共享首选项获取值时出现空指针异常