0


SpringBoot 全局异常处理——解决404/500

SpringBoot 全局异常处理——解决404/500

SpringBoot要全局处理 Spring Boot 应用程序中的 HTTP 404 和 500 错误,您可以自定义一个异常处理器类,并使用

@ControllerAdvice

@ExceptionHandler

注释来拦截和处理这些异常。

解决方案

下面是一种可能的实现方式,它捕获HTTP GET请求

PathVariable

参数类型不匹配、参数格式错误以及其他所有未处理的异常,并返回一个包含错误代码和错误消息的 Map 对象:

@ControllerAdvicepublicclassGlobalExceptionHandler{// 捕获 PathVariable 参数类型不匹配或格式错误的异常,并返回错误信息@ExceptionHandler(MethodArgumentTypeMismatchException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublicMap<String,Object>handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex){returncreateErrorResponse(HttpStatus.BAD_REQUEST.value(),"请求参数有误: "+ ex.getMessage());}// 捕获其他未处理的异常,并返回错误信息@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublicMap<String,Object>handleUncaughtException(Exception ex){returncreateErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(),"系统内部错误: "+ ex.getMessage());}// 创建包含错误码和错误消息的 Map 对象privateMap<String,Object>createErrorResponse(int code,String message){Map<String,Object> errorResponse =newHashMap<>();
        errorResponse.put("code", code);
        errorResponse.put("message", message);return errorResponse;}}

说明:

在此示例中:

  • 使用 @ControllerAdvice@ExceptionHandler 注释标识此类为全局异常处理程序,并捕获了 MethodArgumentTypeMismatchException 和任何其他未处理的异常。
  • 使用 @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 来指定异常的 HTTP 响应状态码。
  • 使用@ResponseBody注释来告诉 Spring Boot 应用程序,我们不想呈现采用模板引擎进行渲染的视图,而是返回具体的响应正文对象。createErrorResponse() 方法创建并返回包含错误代码和错误消息的 Map 对象。

通用的全局异常处理

@ControllerAdvicepublicclassGlobalExceptionHandler{/**
     * 处理 HTTP 404 错误
     */@ExceptionHandler(NoHandlerFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)@ResponseBodypublicApiErrorhandleNotFound(HttpServletRequest req,Exception ex){returnnewApiError(HttpStatus.NOT_FOUND.value(),"无该资源: "+ req.getRequestURI());}/**
     * 处理 HTTP 500 错误
     */@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublicApiErrorhandleInternalServerError(HttpServletRequest req,Exception ex){returnnewApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(),"服务器内部错误: "+ ex.getMessage());}/**
     * 处理用户登录异常
     */@ExceptionHandler(UserLoginException.class)@ResponseStatus(HttpStatus.UNAUTHORIZED)@ResponseBodypublicApiErrorhandleUserLoginException(HttpServletRequest req,UserLoginException ex){returnnewApiError(HttpStatus.UNAUTHORIZED.value(),"用户登录失败: "+ ex.getMessage());}/**
     * 处理其他所有未处理的异常
     */@ExceptionHandler(Throwable.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublicApiErrorhandleOtherExceptions(HttpServletRequest req,Throwable ex){returnnewApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(),"系统内部错误: "+ ex.getMessage());}}

触发异常

我们在控制器中模拟一个用户登录失败的场景,并将 UserLoginException 抛出:

@RestControllerpublicclassUserController{@AutowiredprivateUserService userService;@PostMapping("/login")publicStringlogin(@RequestBodyLoginForm form){// 验证用户名和密码if(!userService.validate(form.getUsername(), form.getPassword())){// 用户不存在或密码错误,抛出 UserLoginException 异常thrownewUserLoginException("用户名或密码不正确");}// 登录成功,返回 token 或用户信息// ......}}
标签: spring boot java 后端

本文转载自: https://blog.csdn.net/weixin_46532941/article/details/130475589
版权归原作者 CN-ZHANG 所有, 如有侵权,请联系我们删除。

“SpringBoot 全局异常处理——解决404/500”的评论:

还没有评论