• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
CN-ZHANG
帮助1

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

SpringBoot要全局处理 Spring Boot 应用程序中的 HTTP 404 和 500 错误,您可以自定义一个异常处理器类,并使用 @ControllerAdvice@ExceptionHandler 注释来拦截和处理这些异常。

解决方案

下面是一种可能的实现方式,它捕获HTTP GET请求PathVariable参数类型不匹配、参数格式错误以及其他所有未处理的异常,并返回一个包含错误代码和错误消息的 Map 对象:

@ControllerAdvice
public class GlobalExceptionHandler {
     
    // 捕获 PathVariable 参数类型不匹配或格式错误的异常,并返回错误信息
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public Map<String, Object> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex) {
        return createErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数有误: "   ex.getMessage());
    }
 
    // 捕获其他未处理的异常,并返回错误信息
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public Map<String, Object> handleUncaughtException(Exception ex) {
        return createErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统内部错误: "   ex.getMessage());
    }
 
    // 创建包含错误码和错误消息的 Map 对象
    private Map<String, Object> createErrorResponse(int code, String message) {
        Map<String, Object> errorResponse = new HashMap<>();
        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 对象。

通用的全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    
    /**
     * 处理 HTTP 404 错误
     */
    @ExceptionHandler(NoHandlerFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public ApiError handleNotFound(HttpServletRequest req, Exception ex) {
        return new ApiError(HttpStatus.NOT_FOUND.value(), "无该资源: "   req.getRequestURI());
    }
 
    /**
     * 处理 HTTP 500 错误
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ApiError handleInternalServerError(HttpServletRequest req, Exception ex) {
        return new ApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "服务器内部错误: "   ex.getMessage());
    }
 
    /**
     * 处理用户登录异常
     */
    @ExceptionHandler(UserLoginException.class)
    @ResponseStatus(HttpStatus.UNAUTHORIZED)
    @ResponseBody
    public ApiError handleUserLoginException(HttpServletRequest req, UserLoginException ex) {
        return new ApiError(HttpStatus.UNAUTHORIZED.value(), "用户登录失败: "   ex.getMessage());
    }
 
    /**
     * 处理其他所有未处理的异常
     */
    @ExceptionHandler(Throwable.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ApiError handleOtherExceptions(HttpServletRequest req, Throwable ex) {
        return new ApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "系统内部错误: "   ex.getMessage());
    }
}
学新通

触发异常

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

@RestController
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @PostMapping("/login")
    public String login(@RequestBody LoginForm form) {
        // 验证用户名和密码
        if (!userService.validate(form.getUsername(), form.getPassword())) {
            // 用户不存在或密码错误,抛出 UserLoginException 异常
            throw new UserLoginException("用户名或密码不正确");
        }
         
        // 登录成功,返回 token 或用户信息
        // ......
    }
}

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaaack
系列文章
更多 icon
同类精品
更多 icon
继续加载