排除Spring MVC控制器

时间:2017-03-02 10:12:19

标签: java spring spring-mvc

我目前正在尝试创建一个Controller来全局处理所有未知的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";
    }
}

我的目的是确保不会调用刚刚向浏览器返回字符串“Not Found”的默认servlet。此策略有效,因为此控制器处理了所有未知URL。

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

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    registry.addResourceHandler("/js/**").addResourceLocations("/js/");
    registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}

因此,不是我的静态文件提供给浏览器,我的错误页面就是在它的位置提供的。虽然我后来才知道控制器映射优先于此answer的静态资源。这就是我想知道如何将我的资源url映射排除在此控制器处理之外的原因,因此它只会涉及捕获未知URL。

在继续这个策略之前,我尝试过其他一些我无法工作的事情(我可能会遗漏一些事情)

  1. DispatcherServlet throwExceptionIfNoHandlerFound 字段设置为true,以便在找不到URL映射的处理程序时应该抛出的异常然后全局处理它描述here。但是,似乎总是为未知路径(/ **)分配默认处理程序,因此不会抛出任何异常。
  2. 创建了一个application.properties文件并设置spring.mvc.throw-exception-if-no-handler-found = true。
  3. 我的所有配置都是基于Java的,没有任何xml文件,并且希望保持这种方式。

3 个答案:

答案 0 :(得分:1)

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

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

It as a nice blog entry about exception handlers in Spring MVC.

如果dispatcherServlet在404的情况下没有抛出异常,那么你应该使用DispatcherServlet的setThrowExceptionIfNoHandlerFound()方法打开它。

Here you can find more information about, how to turn it on

答案 1 :(得分:1)

答案 2 :(得分:0)

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

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

这将配置一个DefaultServletHttpRequestHandler,其URL映射为/ **,如Spring mvc文档的section中所述。这就是为什么在没有找到URL的处理程序时抛出没有异常的原因,即使我已经将我的throwExceptionIfNoHandlerFound的{​​{1}}设置为true,正如我在我的问题中所述。

从我的班级中删除配置后。我创建了一个全局异常处理程序类,并为DispatcherServlet个案例添加了一个方法。这是在没有为URL映射找到Controller处理程序时抛出的异常。示例代码如下所示。这在spring {mvc文档的section中也有很好的解释。

NoHandlerFoundException