专栏首页深入理解JavaSpring Boot错误处理

Spring Boot错误处理

Spring Boot常见的错误处理方法有三种,在实际使用的过程中选择其中一种即可。

方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController。

package com.lemon.springboot.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/error")
public class BaseErrorController implements ErrorController {

    public static final Logger logger = LoggerFactory.getLogger(BaseErrorController.class);

    @Override
    public String getErrorPath() {
        logger.info("这是错误页面");
        return "error/error";
    }

    @RequestMapping
    public String error() {
        return getErrorPath();
    }
}

自定义一个类实现ErrorController,当系统发生404或者500错误的时候,就会自动进入到自定义的错误页面中,这要求在resources文件里面的templates文件内部建立一个error文件夹,里面放自定义错误页面的模板即可。当访问/error这个路径的时候,也会进入错误页面。

方法二:添加自定义的错误页面。

1)html静态页面:在resources/public/error/ 下定义 如添加404页面: resources/public/error/404.html页面,中文注意页面编码 2)模板引擎页面:在templates/error/下定义 如添加5xx页面: templates/error/5xx.ftl

注:templates/error/ 这个的优先级比较 resources/public/error/高,当系统发生错误的时候,会自动去加载那些定义好的页面。

方法三:使用注解@ControllerAdvice,推荐使用。

编写一个全局异常处理的类,这个类里面可以分门别类处理各种异常,可以对每一种异常提供一种自定义页面,使用户体验更加友好。这里仅仅处理了运行时异常和空指针异常。

package com.lemon.springboot.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author lemon
 */
@ControllerAdvice
public class ErrorExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(ErrorExceptionHandler.class);

    /**
     * 处理运行时异常的方法
     * @param exception 运行时异常
     * @return ModelAndView实例对象
     */
    @ExceptionHandler({RuntimeException.class})
    @ResponseStatus(HttpStatus.OK)
    public ModelAndView processException(RuntimeException exception) {
        logger.info("自定义异常处理-RuntimeException");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", exception.getMessage());
        modelAndView.setViewName("500");
        return modelAndView;
    }

    /**
     * 处理空指针异常的页面
     * @param exception 空指针异常
     * @return ModelAndView实例对象
     */
    @ExceptionHandler({NullPointerException.class})
    @ResponseStatus(HttpStatus.OK)
    public ModelAndView processException(NullPointerException exception) {
        logger.info("自定义异常处理-NullPointerException");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message", exception.getMessage());
        modelAndView.setViewName("nullPointer");
        return modelAndView;
    }
}

这里使用到了ModelAndView,必须在templates文件夹下建立error文件夹,然后放500.html和nullPointer.html模板文件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot整合Redis

    本次测试一共设置了三个实体类,分别是User(用户)、Role(角色)、Department(部门)。三者之间的关系是:一个用户可以拥有多个角色,也就是用户和...

    itlemon
  • Spring Boot+JPA+Mysql完成数据库整合操作

    Spring Boot结合JPA操作Mysql数据库十分方便,可以做到零配置文件。具体流程如下。

    itlemon
  • Spring Cloud微服务技术栈(五):客户端负载均衡Spring Cloud Ribbon部分源码分析

    为了使客户端具备负载均衡的能力,我们在代码中将RestTemplate交给Spring管理的时候,会加上@LoadBalanced注解,如下代码所示:

    itlemon
  • 知识点-Spring Boot 统一异常处理汇总

    上面讲的是做页面开发的时候遇到的问题,还有一种情况就是用来开发Rest接口,当错误的时候我们希望返回给用户的是我们接口的标准格式,不是返回一段html代码。

    猿天地
  • SpringBoot错误页配置及项目全局错误处理

    1> 用户体验:当我们请求路径写错时,浏览器显示一个"Whitelabel Error Page",对用户来说体验不友好。

    Java编程指南
  • Vue 折腾记 - (10) 给axios做个挺靠谱的封装(报错,鉴权,跳转,拦截,提示)

    不推荐完全copy过去,可以看看我是如何针对我这边业务; 做的一个axios的封装及实现的思路

    CRPER
  • SpringCloud学习笔记(2):使用Ribbon负载均衡

    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以...

    布禾
  • 聊聊elasticsearch的ZenPing

    elasticsearch-7.0.0/server/src/main/java/org/elasticsearch/discovery/zen/ZenPing...

    codecraft
  • Spring Boot整合Redis

    本次测试一共设置了三个实体类,分别是User(用户)、Role(角色)、Department(部门)。三者之间的关系是:一个用户可以拥有多个角色,也就是用户和...

    itlemon
  • 聊聊elasticsearch的ZenPing

    elasticsearch-7.0.0/server/src/main/java/org/elasticsearch/discovery/zen/ZenPing...

    codecraft

扫码关注云+社区

领取腾讯云代金券