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

这篇具有很好参考价值的文章主要介绍了SpringBoot 全局异常处理——解决404/500。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 抛出:文章来源地址https://www.toymoban.com/news/detail-734717.html

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

到了这里,关于SpringBoot 全局异常处理——解决404/500的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot统一异常处理和统一返回格式

    上篇博客我们讲解了使用AOP来进行统一的用户登录判断,其实像这种功能统一且使用较多的地方,都可以用AOP来处理,除了统⼀的⽤户登录判断之外,AOP 还可以实现: 统⼀⽇志记录 统⼀⽅法执⾏时间统计 (在性能优化阶段,监控流量,接口的响应时间等甚至每个方法的响应

    2024年02月15日
    浏览(35)
  • SpringBoot第14讲:SpringBoot 如何统一异常处理

    本文是SpringBoot第14讲,SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例, 如何优雅的将参数校验的错误信息统一处理并封装返回呢

    2024年02月11日
    浏览(45)
  • springboot 统一异常处理 + 日志记录

          在项目的开发中,在某些情况下,比如非业务的操作,日志记录,权限认证和异常处理等。我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。先简单介绍一下不同的拦截方式。 可以获得Http原始的请求和响应信息,

    2023年04月17日
    浏览(42)
  • springboot全局异常处理和自定义异常处理

    在spring项目中,优雅处理异常,好处是可以将系统产生的全部异常统一捕获处理,自定义的异常也由全局异常来捕获,如果涉及到validator参数校验器使用全局异常捕获也是较为方便。 GlobalExceptionHandler类: 自定义异常CustomException类: 通用返回类:AjaxResult 枚举类ResultCodeEnum:

    2024年02月04日
    浏览(41)
  • SpringBoot全局异常处理源码

    今天这里叙述的全局异常处理是SpringBoot在Servlet场景下的处理机制,重点是 Servlet 模式,当然 WEBFLUX 今天不做过多描述,SpringBoot2.2.x以后引入的一种响应式web开发,在SpringBoot启动类中可以看到: deduceFromClasspath 方法: 既然是SringBoot的webServlet场景,自然不可以放过的就是 Dis

    2024年02月07日
    浏览(46)
  • SpringBoot全局异常页面处理学习

    首先我们先在控制器中写一个异常,默认情况下我们的SpringBoot异常页面是这个样子的。 示例代码如下:  一、自定义静态异常页面 自定义静态异常页面,我们可以分成两种方式,第一种就是使用HTTP状态码来命名页面,例如404.html,403.html,500html等。另一种就是直接定义一个4

    2024年02月09日
    浏览(46)
  • SpringBoot全局异常处理 | Java

    ⭐ 简单说两句 ⭐ 作者: 后端小知识 CSDN 个人主页 :后端小知识 🔎 GZH : 后端小知识 🎉 欢迎关注 🔎 点赞 👍 收藏 ⭐️ 留言 📝 亲爱的友友们,我们今天来讲一讲 SpringBoot 的全局异常处理吧😎 🎨什么是全局异常? 全局异常指的是在程序运行过程中发生的非预期异常,

    2024年02月08日
    浏览(36)
  • SpringBoot -05 SpringBoot web相关配置(静态资源访问、统一异常处理、文件上传、拦截器、统一跨域请求处理)

    小总结 SpringBoot是一个基于Spring的工具集,去帮我们完成了大量的配置。在SpringBoot中有一个约定大于配置的概念,就是他把我们很多第三方框架帮我们写好了,而且把我们整个第三方框架所需要的依赖全都通过起步依赖加进去了。开发中只需要加入起步依赖就可以实现某个场

    2024年02月01日
    浏览(43)
  • SpringBoot项目 Tomcat部署war程序时启动成功但是访问404异常处理

    Springboot项目 使用IntelliJ IDEA 将maven项目打war包,pom.xml文件中引入了依赖 并通过maven的package打包完后,放入tomcat的web-apps文件下 同时修改了打开conf文件夹下的server.xml文件,启动tomcat时出现了以下问题 SpringApplicationBuilder用于构建 Spring 应用,是SpringApplication和ApplicationContext实例

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包