• Spring boot 定制自己的错误


    1)、如何定制错误的页面;

    ​   1)、有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面;

    ​ 我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);

    ​   页面能获取的信息;

        ​ timestamp:时间戳

    ​     status:状态码

    ​     error:错误提示

    ​     exception:异常对象

    ​     message:异常消息

    ​     errors:JSR303数据校验的错误都在这里

    ​ 2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;

    ​ 3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;

    2)、如何定制错误的json数据;

    ​ 1)、自定义异常处理&返回定制json数据;

        @ResponseBody
        @ExceptionHandler(UserNotExistException.class)
        public Map<String,Object> handleException(Exception e){
            Map<String,Object> map = new HashMap<>();
            map.put("code","user.notexist");
            map.put("message",e.getMessage());
            return map;
        }

    2)、转发到/error进行自适应响应效果处理

    @ControllerAdvice
    public class DemoExceptionHandler {
    
        @ExceptionHandler(DemoException.class)
        public String handleException(Exception e, HttpServletRequest request){
            Map<String,Object> map = new HashMap<>();
    
            //传入我们自己的错误状态码  4xx 5xx
            //Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
            //设置成自己的状态码
            request.setAttribute("javax.servlet.error.status_code",500);
            map.put("code","user.notexist");
            map.put("message","用户出错啦");
    
            request.setAttribute("ext",map);
            //转发到 /error由我们的BasicError 来处理返回JSON还是页面..
            return "forward:/error";
        }
    
    }

    3)、将我们的定制数据携带出去

    出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法);

    ​ 1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;

    ​ 2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;

    ​ 容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;

    自定义ErrorAttributes
    //定义自己的错误消息
    @Component
    public class MyErrorAttributes extends DefaultErrorAttributes {
    
        @Override
        public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
            Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
            map.put("company", "hh");

        //我们的异常处理器携带的数据 requestAttributes为请求域中取数据
        Map<String,Object> ext = (Map<String, Object>) requestAttributes.getAttribute("ext", 0);
        map.put("ext",ext);
        return map; }
    }

    原因: 如下图,我们放入ErrorAttributes 就会加入数据并返回

     最终的效果:响应是自适应的,可以通过定制ErrorAttributes改变需要返回的内容,

  • 相关阅读:
    Unity3D 5.3 新版AssetBundle使用方案及策略
    解构C#游戏框架uFrame兼谈游戏架构设计
    漫谈C#编程语言在游戏领域的应用
    TDD在Unity3D游戏项目开发中的实践
    趣说游戏AI开发:曼哈顿街角的A*算法
    “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
    趣说游戏AI开发:对状态机的褒扬和批判
    使用TypeScript拓展你自己的VS Code!
    MVP社区巡讲-云端基础架构:12月5日北京站 12月12日上海站
    【转】Spring Boot干货系列:(一)优雅的入门篇
  • 原文地址:https://www.cnblogs.com/eason-d/p/9315207.html
Copyright © 2020-2023  润新知