我目前正在尝试创建一个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。
在继续这个策略之前,我尝试过其他一些我无法工作的事情(我可能会遗漏一些事情)
我的所有配置都是基于Java的,没有任何xml文件,并且希望保持这种方式。
答案 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()方法打开它。
答案 1 :(得分:1)
Spring Boot 1.4+支持基于HTML状态代码的声明性错误页面。
答案 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