Java 排除Spring MVC控制器请求映射中的某些路径

Java 排除Spring MVC控制器请求映射中的某些路径,java,spring,spring-mvc,Java,Spring,Spring Mvc,我目前正在尝试创建一个控制器来全局处理所有未知URL。所以我做的是创建一个类似于下面的控制器 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping

我目前正在尝试创建一个控制器来全局处理所有未知URL。所以我做的是创建一个类似于下面的控制器

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/**")
public class UnknownUrlController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getError404() {
        return "/error404";
    }
}
我的意图是确保不调用只向浏览器返回字符串“notfound”的默认servlet。由于所有未知URL都由该控制器处理,因此此策略有效

但是问题是,我在WebMVCConfigureAdapter中配置的所有静态资源(图像、js和css文件)也会调用控制器,如下所示

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}
因此,我的错误页面不是提供给浏览器的静态文件,而是提供给浏览器的。尽管我后来了解到控制器映射优先于静态资源。这就是为什么我想知道如何将我的资源url映射从该控制器的处理中排除,以便它只关注捕获未知url

在继续实施这一策略之前,我尝试了一些我无法投入工作的其他事情(我可能错过了一些东西)

  • 将my DispatcherServlet的ThroweExceptionIfNoHandlerFound字段设置为true,以便在未找到URL映射的处理程序时引发异常,然后按照所述全局处理该异常。但是,似乎总是为未知路径(/**)分配默认处理程序,因此不会引发任何异常
  • 创建了application.properties文件,并设置spring.mvc.throw异常(如果未找到处理程序)=true

  • 我所有的配置都是基于Java的,没有任何xml文件,我更愿意保持这种方式

    在Spring中编写自定义错误处理程序有更好的方法。见下文:

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleResourceNotFoundException() {
        return "notfound";
    }
    

    如果dispatcherServlet在404的情况下未引发异常,则应使用dispatcherServlet的setThroweExceptionIfNoHandlerFound()方法将其打开


    Spring Boot 1.4+支持基于HTML状态代码的声明性错误页面


    终于找到了解决问题的方法。解决方案是删除Java配置中的默认servlet处理程序。在我的Java配置类(扩展WebMVCConfigureAdapter的类)中,我之前启用了默认Servlet,如下所示

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    
    这将使用URL映射/**配置DefaultServletHttpRequestHandler,如Spring mvc文档中所述。这就是为什么在找不到URL处理程序时不会引发异常的原因,即使我已将我的
    DispatcherServlet
    ThroweExceptionIfNoHandlerFound
    设置为true,正如我在问题中所述

    从我的类中删除配置后。我创建了一个全局异常处理程序类,并为
    NoHandlerFoundException
    案例添加了一个方法。这是在找不到URL映射的控制器处理程序时引发的异常。示例代码如下所示。这在SpringMVC文档中也有很好的解释

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(NoHandlerFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        @RequestMapping( value = {"/*","/**"},method = RequestMethod.GET)
        public String handle(HttpServletRequest request, NoHandlerFoundException ex) {
            return "error-404";
        }
    }
    

    你好,Sawo。我也阅读了这个链接。如果你看一下我说的我尝试过的第一件事,这里的链接实际上是指向同一篇文章的链接。我在实现该技术时遇到的问题是,当URL未映射到任何控制器时,DispatcherServlet不会引发任何异常。因此,不会引发任何可以处理的异常。在dispatcherServlet中,您可以设置它在404的情况下引发异常。下面是控制它的方法:Hi Sawo。我也试过了,但它没有抛出异常,而是一直分配给默认Servlet,该Servlet只返回“未找到”到browserSpring Boot 1.4+支持基于HTTP状态代码的自定义错误页,声明性地说:我试着像我在问题中所说的那样打开它。在我尝试的两件事中,这是我写的第一件事。它不起作用。异常仍然没有被抛出