我目前正在尝试创建一个 Controller 来处理全局所有未知的 URL。所以我所做的是创建一个类似于下面的 Controller
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 均由该 Controller 处理。
但是问题是,我在 WebMvcConfigurerAdapter 中配置的所有静态资源(图像、js 和 css 文件)也调用了 Controller ,如下所示
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}
因此,我的错误页面代替了向浏览器提供的静态文件。尽管我后来从这个 answer 了解到 Controller 映射优先于静态资源。 。这就是我想知道如何排除我的资源 url 映射不被该 Controller 处理的原因,这样它就只关心捕获未知的 URL。
在继续执行此策略之前,我尝试了一些其他我无法正常工作的事情(我可能错过了一些东西)
- 将 DispatcherServlet 的 throwExceptionIfNoHandlerFound 字段设置为 true,以便在找不到 URL 映射的处理程序时抛出异常,然后将其全局处理为描述here 。然而,似乎总是为未知路径(/**)分配默认处理程序,因此不会抛出异常。
- 创建了 application.properties 文件并设置 spring.mvc.throw-exception-if-no-handler-found=true。
我的所有配置都是基于 Java 的,没有任何 xml 文件,并且希望保持这种方式。
最佳答案
有一种更好的方法在 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() 方法将其打开。
关于java - 排除 Spring MVC Controller 的请求映射中的某些路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42552501/