Spring @ControllerAdvice 与 ErrorController

作者:编程家 分类: spring 时间:2025-07-18

一篇关于Spring @ControllerAdvice与ErrorController的文章。

在Spring框架中,我们经常会遇到处理异常的情况。为了更好地统一管理和处理异常,Spring提供了@ControllerAdvice注解和ErrorController接口。

使用@ControllerAdvice统一处理异常

@ControllerAdvice是一个用于定义全局异常处理的注解。通过在一个类上添加@ControllerAdvice注解,该类就成为了一个全局异常处理类。它可以捕获所有控制器中抛出的异常,并对这些异常进行统一的处理。

下面是一个使用@ControllerAdvice的示例代码:

java

@ControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)

public ResponseEntity handleException(Exception ex) {

// 异常处理逻辑

return new ResponseEntity<>("Something went wrong", HttpStatus.INTERNAL_SERVER_ERROR);

}

}

在上述代码中,我们定义了一个名为GlobalExceptionHandler的全局异常处理类。该类中的handleException方法使用@ExceptionHandler注解来指定要处理的异常类型,这里我们处理的是所有的Exception类型的异常。在方法体中,我们可以编写自定义的异常处理逻辑,例如返回一个错误信息和相应的HTTP状态码。

使用@ControllerAdvice可以有效地减少代码的重复性,将异常处理逻辑集中在一个类中,使代码更加清晰和易于维护。

使用ErrorController处理错误页面

除了统一处理异常,Spring还提供了ErrorController接口来处理错误页面。当应用程序遇到错误时,可以通过实现ErrorController接口来自定义错误页面的展示方式。

下面是一个使用ErrorController的示例代码:

java

@Controller

public class CustomErrorController implements ErrorController {

@RequestMapping("/error")

public String handleError(HttpServletRequest request) {

Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

if (status != null) {

int statusCode = Integer.parseInt(status.toString());

if (statusCode == HttpStatus.NOT_FOUND.value()) {

return "error-404";

} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {

return "error-500";

}

}

return "error";

}

@Override

public String getErrorPath() {

return "/error";

}

}

在上述代码中,我们实现了ErrorController接口并重写了其中的handleError方法。该方法根据请求中的错误状态码来决定返回哪个错误页面。例如,如果错误状态码是404,我们返回error-404页面;如果错误状态码是500,我们返回error-500页面。

通过实现ErrorController接口,我们可以根据具体的业务需求来展示自定义的错误页面,提高用户体验和系统可维护性。

通过使用@ControllerAdvice和ErrorController,我们可以更好地统一管理和处理异常,提高代码的可维护性和可读性。@ControllerAdvice用于统一处理控制器中抛出的异常,而ErrorController用于自定义错误页面的展示方式。

在开发过程中,我们可以根据具体的业务需求来编写自定义的异常处理逻辑和错误页面,以提供更好的用户体验和系统健壮性。

希望本文对您理解Spring @ControllerAdvice和ErrorController的使用有所帮助!