当前位置: 首页 > 知识库问答 >
问题:

SpringMVC:如何在返回错误页面/响应之前拦截404?

盖和洽
2023-03-14

在我的Spring Boot 2.2. x Web应用程序中,我需要拦截404错误,以便在呈现错误页面或返回带有错误信息的json之前执行一些自定义逻辑。

实现这一点的正确方法是什么?

目前,我正在尝试使用@ControllerAdvice类,但我不知道使用@ExceptionHandler(如果抛出了任何异常)处理哪个异常。。。

注意:我已经尝试拦截NoHandlerFoundException,但这似乎不起作用...(未触发处理程序)。

@ControllerAdvice
public class ErrorHandler {
    @ExceptionHandler(NoHandlerFoundException.class)
    public void handleException() {
        System.out.println("It's a 404!");
    }
}

我还在<code>应用程序中启用了此功能。属性:

spring.mvc.throw-exception-if-no-handler-found=true

还有其他建议吗?

共有3个答案

齐志勇
2023-03-14

在同一个类中,您使用< code>@ControllerAdvice实现< code>ErrorController。

@ControllerAdvice
public class ControllerAdvice implements ErrorController {

    @RequestMapping("/error")
    public ResponseEntity<Map> handleError(HttpServletResponse response) {
        Map errorMapJson = new HashMap();

        if(response.getStatus() == HttpStatus.NOT_FOUND.value()) {
            errorMapJson.put("type", "404 Error");
        }

        return new ResponseEntity<Map>(errorMapJson, HttpStatus.NOT_FOUND);
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}
臧亦
2023-03-14

使用<code>NoHandlerFoundException。这映射到spring boot中的404。

章阳波
2023-03-14

我终于在这个问题中找到了解决方案(或它的一部分):NoHandlerFoundException的自定义异常处理程序在没有@EnableWebMvc

默认情况下,Spring不会为404错误引发异常。您需要在<code>应用程序中启用此属性。属性(或yaml):

spring.mvc.throw-exception-if-no-handler-found=true

但是您还需要设置这个属性:

spring.mvc.static-path-pattern: /static

这个限制阻止Spring搜索与丢失的路径/处理程序匹配的静态内容。

现在您可以像往常一样使用@ExceptionHandler拦截NoHandlerFoundException

请注意,在设置<code>spring.mvc之前。静态路径模式属性我试图将<code>@EnableWebMvc,但我显然丢失了所有Spring Boot自动配置。

 类似资料:
  • 前端使用vue,后端使用springboot,前后端分离,且已解决跨域,登录采用jwt验证 想实现功能:如果用户通过url栏输入地址方式来访问某个页面(非登录页),对未登录用户自动跳转登录页面 请问拦截器是设置在后端还是设置在前端?另外对于静态页面能拦截吗

  • 本文向大家介绍详解利用SpringMVC拦截器控制Controller返回值,包括了详解利用SpringMVC拦截器控制Controller返回值的使用技巧和注意事项,需要的朋友参考一下 背景:需求是在Controller中方法没有实现时,返回模拟结果。主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果。本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能

  • 我必须从网页上阅读某个领域的内容。有人告诉我,我需要获取整个页面,然后从html内容中提取文本。我使用以下程序来获取所需的页面html内容。现在的问题是,这个网页需要几秒钟的时间来加载我想要读取的实际文本值,即使其他静态页面组件都是在前面加载的。我的程序在静态组件加载之后,但在我的值加载之前,返回html内容。因此,我得到的最终HTML具有页面加载过程pic,而不是实际值。有没有人可以指导我在这个

  • 我必须从网页上阅读某一领域的内容。我已经被告知,我需要获得整个页面,然后从html内容中提取文本。我正在使用下面的程序来获取所需的页面html内容。现在的问题是,这个网页加载我想要读取的实际文本值需要几秒钟的时间,即使前面加载了其余的静态页面组件。我的程序在静态组件加载之后但在我的值加载之前返回html内容。因此,我得到的最终HTML有页面加载过程pic,而不是实际值。有没有人可以指导我在这个程序

  • 我想拦截一个错误的JSON输入,并使用Dropwizard应用程序返回自定义错误消息。我遵循了这里提到的定义自定义异常映射器的方法:http://gary-rowe.com/agilestack/2012/10/23/how-to-implement-a-runtimeexceptionmapper-for-dropwizard/。但它不适合我。同样的问题也被问到这里https://groups.