Java 排除Spring MVC控制器请求映射中的某些路径
我目前正在尝试创建一个控制器来全局处理所有未知URL。所以我做的是创建一个类似于下面的控制器Java 排除Spring MVC控制器请求映射中的某些路径,java,spring,spring-mvc,Java,Spring,Spring Mvc,我目前正在尝试创建一个控制器来全局处理所有未知URL。所以我做的是创建一个类似于下面的控制器 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping
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";
}
}
我的意图是确保不调用只向浏览器返回字符串“notfound”的默认servlet。由于所有未知URL都由该控制器处理,因此此策略有效
但是问题是,我在WebMVCConfigureAdapter中配置的所有静态资源(图像、js和css文件)也会调用控制器,如下所示
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/img/**").addResourceLocations("/img/");
}
因此,我的错误页面不是提供给浏览器的静态文件,而是提供给浏览器的。尽管我后来了解到控制器映射优先于静态资源。这就是为什么我想知道如何将我的资源url映射从该控制器的处理中排除,以便它只关注捕获未知url
在继续实施这一策略之前,我尝试了一些我无法投入工作的其他事情(我可能错过了一些东西)
我所有的配置都是基于Java的,没有任何xml文件,我更愿意保持这种方式 在Spring中编写自定义错误处理程序有更好的方法。见下文:
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleResourceNotFoundException() {
return "notfound";
}
如果dispatcherServlet在404的情况下未引发异常,则应使用dispatcherServlet的setThroweExceptionIfNoHandlerFound()方法将其打开
Spring Boot 1.4+支持基于HTML状态代码的声明性错误页面
终于找到了解决问题的方法。解决方案是删除Java配置中的默认servlet处理程序。在我的Java配置类(扩展WebMVCConfigureAdapter的类)中,我之前启用了默认Servlet,如下所示
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
这将使用URL映射/**配置DefaultServletHttpRequestHandler,如Spring mvc文档中所述。这就是为什么在找不到URL处理程序时不会引发异常的原因,即使我已将我的DispatcherServlet
的ThroweExceptionIfNoHandlerFound
设置为true,正如我在问题中所述
从我的类中删除配置后。我创建了一个全局异常处理程序类,并为NoHandlerFoundException
案例添加了一个方法。这是在找不到URL映射的控制器处理程序时引发的异常。示例代码如下所示。这在SpringMVC文档中也有很好的解释
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
@RequestMapping( value = {"/*","/**"},method = RequestMethod.GET)
public String handle(HttpServletRequest request, NoHandlerFoundException ex) {
return "error-404";
}
}
你好,Sawo。我也阅读了这个链接。如果你看一下我说的我尝试过的第一件事,这里的链接实际上是指向同一篇文章的链接。我在实现该技术时遇到的问题是,当URL未映射到任何控制器时,DispatcherServlet不会引发任何异常。因此,不会引发任何可以处理的异常。在dispatcherServlet中,您可以设置它在404的情况下引发异常。下面是控制它的方法:Hi Sawo。我也试过了,但它没有抛出异常,而是一直分配给默认Servlet,该Servlet只返回“未找到”到browserSpring Boot 1.4+支持基于HTTP状态代码的自定义错误页,声明性地说:我试着像我在问题中所说的那样打开它。在我尝试的两件事中,这是我写的第一件事。它不起作用。异常仍然没有被抛出