广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringBoot 全局异常处理——解决404/500
  • 142
分享到

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

springbootjava后端 2023-09-28 17:09:33 142人浏览 薄情痞子
摘要

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

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

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

解决方案

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

@ControllerAdvicepublic 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 对象。

通用的全局异常处理

@ControllerAdvicepublic class GlobalExceptionHandler {            @ExceptionHandler(NoHandlerFoundException.class)    @ResponseStatus(HttpStatus.NOT_FOUND)    @ResponseBody    public apiError handleNotFound(HttpServletRequest req, Exception ex) {        return new ApiError(HttpStatus.NOT_FOUND.value(), "无该资源: " + req.getRequestURI());    }         @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 抛出:

@RestControllerpublic 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 或用户信息        // ......    }}

来源地址:https://blog.csdn.net/weixin_46532941/article/details/130475589

--结束END--

本文标题: SpringBoot 全局异常处理——解决404/500

本文链接: https://www.lsjlt.com/news/420263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作