(13)spring boot 定制错误界面(信息)

如何定制错误页面?

1.在有模板引擎的前提下(一般都有Thymeleaf,会访问error/状态码.html界面

我们只需要在模板下,即templates文件夹下建立一个error文件夹,建立一个HTML,名称为4xx5xx,或者具体的400.html,404.html界面。之所以可以用4xx这样的模糊名称,因为spring boot里面对于无法找到精确的名称就会寻找模糊的。注意,这里优先精确页面。

页面可以拿到的信息(仅限在模板里使用)

使用样例:

<h1>staus:[[${status}]]</h1>

<h2>timestamp:[[${timestamp}]]</h2>

,在有模板的情况下使用还是十分的简单的!

2.在没有模板的情况下,会去静态资源文件夹下寻找。即在resource文件夹的static文件夹下寻找error文件夹,不过在这里由于没有模板引擎,就拿不到上面说的那些信息了。

3.没有静态资源下的相应error文件夹,也没有模板引擎的情况下,就会返回spring boot默认错误界面。

注意:用第一条就好啦。。

 

 

定制错误信息  

使用系统自带的错误信息,也就是上面罗列的那几个,有时候是不够用的。

这个时候可以使用定制的错误信息,可以再界面上显示自己定制的错误信息,更加灵活。

具体做法:

1.开一个包exception:

idea中对于自定义异常的类的标志是一个闪电哈。

内容为:

package com.jiangyi.springboot.exception;



public class UserNotExistException extends RuntimeException {

    public UserNotExistException() {

        super("用户不存在!");

    }

}

继承运行时的异常。

2.controller层里面写异常处理类:

这里要可以适应各种客户端,对于pc端,就显示html/text形式的错误界面。

对于手机等等,就显示json数据。

所以,写法:

package com.jiangyi.springboot.controller;




import com.jiangyi.springboot.exception.UserNotExistException;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.ResponseBody;



import javax.servlet.http.HttpServletRequest;

import java.util.HashMap;

import java.util.Map;



@ControllerAdvice

public class MyExceptionHandler {

    //这样写不能自适应界面

    //    @ResponseBody

//    @ExceptionHandler(UserNotExistException.class)

//    public Map<String, Object> handlerException(Exception e){

//        Map<String,Object> map=new HashMap<>();

//        map.put("code","user.notexist");

//        map.put("message",e.getMessage());

//        return map;

//    }



    /**

     * 可以自适应界面

     * @param e

     * @param request

     * @return

     */

    @ExceptionHandler(UserNotExistException.class)

    public String handlerException(Exception e, HttpServletRequest request) {

        Map<String, Object> map = new HashMap<>();

        request.setAttribute("javax.servlet.error.status_code",500);

        map.put("code", "user.notexist");

        map.put("message", e.getMessage());

        request.setAttribute("ext",map);

        return "forward:/error";

    }

}

注意:那里一定需要一个request.setAttribute("javax.servlet.error.status_code",500);

这是必须的map里面写上定制的数据。再将数据

放在request域中给等下要写的DefaultAttributes用。

3.component中写一个:MyErrorAttributes继承自DefaultErrorAttributes,这是spring boot中默认错误信息的类。选择重写getErrorAttributes()方法。(可以使用ctrl+o来选择重写方法)

 

内容:

//给容器中添加我们自己的错误信息

@Component

public class MyErrorAttributes extends DefaultErrorAttributes {

    //返回值的map就是json和界面的所有可以返回的对象

    @Override

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

        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);

        map.put("company","fjnu");

        //我们异常处理器携带的数据

        Map<String,Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);

        map.put("ext",ext);

        return map;

    }

}

将刚才通过request域保存的信息拿出来,存放在存放默认信息的map里面。

注意,这个MyErrorAttributes类,必须得在容器中,也就是必须在类名上加上@Component注解。这样,才可以在这个容器中拿到保存的错误信息(就像等下下面使用的那样)。

4.拿出定制错误信息:

<h1>staus:[[${status}]]</h1>

<h2>timestamp:[[${timestamp}]]</h2>

<h2>exception:[[${exception}]]</h2>

<h2>message:[[${message}]]</h2>

<h2>ext:[[${ext.code}]]</h2>

<h2>ext:[[${ext.message}]]</h2>

可以看到,不论是系统自带的,还是自己定制的,都可以拿到!

ps:在开发中就可以抛出自定义的异常啦:

 @ResponseBody
    @RequestMapping("/hello")
    public String Hello(@RequestParam("user") String user){
        if (user.equals("aaa"))
        {
            throw new UserNotExistException();//抛出错误就可以来到相应的错误界面
        }
        return "Hello World!";
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值