【发布时间】:2017-03-21 19:39:44
【问题描述】:
我目前正在尝试创建一个控制器来全局处理所有未知 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";
}
}
我的意图是确保不调用仅向浏览器返回字符串“未找到”的默认 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。
在继续这个策略之前,我尝试了一些我无法开始工作的其他事情(我可能遗漏了一些东西)
- 将我的 DispatcherServlet 的 throwExceptionIfNoHandlerFound 字段设置为 true,以便在找不到 URL 映射的处理程序时应抛出的异常,然后将其全局处理为描述here。但是,似乎总是为未知路径(/**)分配默认处理程序,因此不会引发异常。
- 创建了一个 application.properties 文件并设置 spring.mvc.throw-exception-if-no-handler-found=true。
我所有的配置都是基于 Java 的,没有任何 xml 文件,并且希望保持这种方式。
【问题讨论】:
标签: java spring spring-mvc