SpringBoot之自定义错误页面

 SpringBoot 默认配置

如果是浏览器请求URL错误,返回错误页面;如果是postman等非浏览器客户端请求URL错误,返回 json 数据:

  • SpringBoot源码:
@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class BasicErrorController extends AbstractErrorController {
    // 浏览器:
    @RequestMapping( produces = {"text/html"} )
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        HttpStatus status = this.getStatus(request);
        // 在这里填充返回的属性值
        Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());
        // 在这里填充返回的页面
        ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
        return modelAndView != null ? modelAndView : new ModelAndView("error", model);
    }

    // 其他客户端: 
    @RequestMapping
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        // 在这里填充返回的属性值
        Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = this.getStatus(request);
        return new ResponseEntity(body, status);
    }

    /* SpringBoot返回错误信息的两种方式都是用getErrorAttributes()方法来给map赋值 */
}


public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered {
     private ModelAndView resolve(String viewName, Map<String, Object> model) {
        // 默认去找到error/下的错误页面
        String errorViewName = "error/" + viewName;
        // 模板引擎寻找错误页面代码
        TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);
        return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model);
    }
}​
  •   这是SpringBoot默认的错误页面

  • 这是SpringBoot默认的错误返回 json属性

 

SpringBoot的默认错误页面修改:

  • 如果在 templates/error 目录下有自定义的 4xx 或 5xx 页面,则使用此页面

  注意 ftl文件的配置路径有坑:

        

 

  • 如果templates/error 目录下没有自定义的错误页面:在 static/error 目录下寻找 4xx 或 5xx 页面,如果找到则使用

        当然,你要先配置SpringMVC静态资源处理:

 

  • 如果 templates/error目录和 static/error目录都没有自定义的 4xx 或 5xx 页面 ,则使用 SpringBoot默认的错误页面 

 

SpringBoot 的默认错误属性设置:

  • getErrorAttribute()方法在这里创建返回错误信息的 Map

  • getErrorAttribute()方法是BaseController的父类AbstractErrorController定义的方法

  • @ConditionalOnMissingBean标记 在容器中没有ErrorController组件时,才使用SpringBoot默认的BasicErrorController

那么我们就可以自己编写一个ErrorController的实现类来处理错误;但是比较麻烦:

所以我们不去编写ErrorController的实现类,而是去继承ErrorController的实现类AbstractErrorController类

然后根据自己的需要重写这两个方法:

但是也比较麻烦;

所以最后应该是重写一下getErrorAttribute()方法:

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {

    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {

        /**
         * 如果这样新建map会继承SpringBoot默认的属性:
         * Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
         */
        Map<String, Object> map = new HashMap<>();

        // 从request中获取 自定义Exception的异常信息
        Map<String, Object> exception = (Map<String, Object>) webRequest.getAttribute("exception", 0);
        map.put("exception", exception);
        return map;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beOkWithAnything

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值