首页 > 其他分享 >SpringBoot复习:(37)自定义ErrorController

SpringBoot复习:(37)自定义ErrorController

时间:2023-08-21 17:36:54浏览次数:33  
标签:ErrorAttributeOptions String 自定义 37 ErrorController springframework org import p


所有接口统一返回的数据格式

package cn.edu.tju.domain;

public class MyResponse {
    private int code;
    private String message;
    private String exception;
    private String stack;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getException() {
        return exception;
    }

    public void setException(String exception) {
        this.exception = exception;
    }

    public String getStack() {
        return stack;
    }

    public void setStack(String stack) {
        this.stack = stack;
    }
}

自定义的ErrorController覆盖默认的BasicErrorController。当出错时,也统一返回自定义的数据格式,而不是Spring的ResponseEntity

package cn.edu.tju.controller;

import cn.edu.tju.domain.MyResponse;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collections;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/error")
public class MyErrorController extends AbstractErrorController {


    public MyErrorController(ErrorAttributes errorAttributes, List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, errorViewResolvers);
    }

    @RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaa");
        HttpStatus status = getStatus(request);
        ErrorAttributeOptions of = ErrorAttributeOptions.of(ErrorAttributeOptions.Include.EXCEPTION,
                ErrorAttributeOptions.Include.MESSAGE,
                ErrorAttributeOptions.Include.EXCEPTION
                //,ErrorAttributeOptions.Include.STACK_TRACE
        );
        Map<String, Object> model = Collections
                .unmodifiableMap(getErrorAttributes(request, of));
        response.setStatus(status.value());
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
    }

    @RequestMapping
    @ResponseBody
    public MyResponse error(HttpServletRequest request) {
        HttpStatus status = getStatus(request);
        if (status == HttpStatus.NO_CONTENT) {
            MyResponse myResponse = new MyResponse();
            myResponse.setCode(204);
            return myResponse;
        }
        ErrorAttributeOptions of = ErrorAttributeOptions.of(ErrorAttributeOptions.Include.EXCEPTION,
                ErrorAttributeOptions.Include.MESSAGE,
                ErrorAttributeOptions.Include.EXCEPTION,
                ErrorAttributeOptions.Include.STACK_TRACE);
        Map<String, Object> body = getErrorAttributes(request, of);
        MyResponse myResponse = new MyResponse();
        myResponse.setCode(200);
        myResponse.setMessage(String.valueOf(body.get("message")));
        myResponse.setException(String.valueOf(body.get("exception")));
        myResponse.setStack(String.valueOf(body.get("trace")));
        //path
        //timestamp
        //error

        return myResponse;
    }
}

SpringBoot默认异常处理自动配置类ErrorMvcAutoConfiguration


标签:ErrorAttributeOptions,String,自定义,37,ErrorController,springframework,org,import,p
From: https://blog.51cto.com/amadeusliu/7177758

相关文章

  • 北大ACM poj3750 小孩报数问题
    小孩报数问题TimeLimit:1000MS MemoryLimit:65536KTotalSubmissions:7233 Accepted:3454Description有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都......
  • 前端项目实战壹佰柒拾陆react-admin+material ui-react-admin之Create之构建自定义字
    我是歌谣微信公众号关注前端小歌谣import{useRecordContext,Show,SimpleShowLayout}from'react-admin';constBookAuthor=()=>{constrecord=useRecordContext();if(!record)returnnull;return<span>{record.author}</span>;};......
  • 【算法】用c#实现自定义字符串编码及围栏解码方法
    编写一个函数/方法,它接受2个参数、一个字符串和轨道数,并返回ENCODED字符串。编写第二个函数/方法,它接受2个参数、一个编码字符串和轨道数,并返回DECODED字符串。然后使用围栏密码对其进行解码。这种密码用于通过将每个字符沿着一组“竖状轨道”依次放在对角线上来对字符串进行编......
  • C# .NET 使用HttpClient,以及自定义Header中存在特殊字符的处理方式
    平常我们在使用HttpClient时,只需要创建加上设置调用接口地址就可以使用了,比如:HttpClienthttpClient=httpClientFactory.CreateClient();httpClient.BaseAddress=newUri(接口地址);httpClient.PostAsync(接口方法,HttpContent);但是,在自定义Header......
  • 最完美LTSC2019_19H1.17763.4737软件选装纯净版VIP51.8
    【系统简介】=============================================================1.本次更新母盘来自LTSC2019_19H1.17763.4737。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为17763.4737。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo-2.13......
  • 前端vue自定义柱形图 选中更改柱形图颜色及文字标注颜色
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • 前端Vue自定义等分底部菜单导航按钮 自适应文字宽度 可更改组件位置
    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随意的进行组合。大大提升开发效率......
  • mybatis设置命名格式转换 与 批量插入更新&select查询返回自定义实体类 的sql写法
    在mybatis的配置文件中设置了Java实体类驼峰命名与表属性下划线命名的自动转换。在mybatis中,从接口获取到大量数据之后,将数据集合分批量插入更新到表中。在mybatis中,select查询表数据,返回数据的存储类型为自定义的实体类。1.设置Java实体类驼峰命名与表属性下划线......
  • SpringBoot使用自定义注解实现数据脱敏
    我们在日常开发中,经常有一些数据中的部分需要隐藏起来,达到数据安全的目的,这一个过程就是数据脱敏。一、自定义数据脱敏枚举类packagecom.example.springbootdemo.enums;importlombok.Getter;importjava.util.function.Function;/***数据脱敏策略枚举*/@Getterpubli......
  • 2-08-Feign-自定义配置
    Feign可以支持很多的自定义配置,如下表所示:类型作用说明feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULLfeign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象feign.codec.Encoder请求参......