我目前正在尝试创建一个Controller以全局处理所有未知的URL。所以我所做的就是创建下面排除Spring MVC控制器的请求映射中的某些路径
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。
之前这一战略出发我已经尝试了一些其他的事情,我不能去上班(我可能失去了一些东西)
- 设置throwExceptionIfNoHandlerFound我的DispatcherServlet的字段设置为true,使当找不到URL映射的处理程序时应抛出的异常,然后按照here所述的全局处理。然而,似乎默认处理程序总是分配给未知路径(/ **),因此不会引发异常。
- 创建了一个application.properties文件并设置了spring.mvc.throw-exception-if-no-handler-found = true。
我所有的配置都是基于Java的,没有任何xml文件,并希望保持这种方式。
Hi Sawo。我也阅读了该链接。如果你看看我说的第一件事,我试过了,这里的链接实际上链接到同一篇文章。我实现该技术的问题是,当URL不映射到任何控制器时,Dispatcher Servlet不会引发任何异常。所以没有可以处理的异常。 – dawuzi
在dispatcherServlet中,你可以设置它应该在404情况下抛出一个异常。下面是控制它的方法:http://docs.spring.io/spring-framework/docs/current/javadoc-api /org/springframework/web/servlet/DispatcherServlet.html#setThrowExceptionIfNoHandlerFound-boolean- – SaWo
Hi Sawo。我也尝试过,但不是抛出一个异常,而是一直分配给默认的Servlet,它只是向浏览器返回“Not Found” – dawuzi