最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot統(tǒng)一異常處理(返回json)并格式化異常

 更新時(shí)間:2023年07月10日 10:59:42   作者:卑微小鐘  
這篇文章主要介紹了springboot統(tǒng)一異常處理(返回json)并格式化異常,對spring boot的默認(rèn)異常處理方式進(jìn)行修改,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應(yīng)用,需要的朋友可以參考下

統(tǒng)一異常處理

當(dāng)用spring boot開發(fā)后端時(shí),我們常采用前后端分離的開發(fā)策略,這時(shí)候要求前端與后端需要進(jìn)行數(shù)據(jù)交互,傳統(tǒng)的一般采用json數(shù)據(jù)交互。

這時(shí)候我們要對spring boot的默認(rèn)異常處理方式進(jìn)行修改了,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應(yīng)用。

首先我們要了解一般springboot的錯誤發(fā)生在什么地方。

一般發(fā)生在controller、業(yè)務(wù)層filter中(如spring security)、攔截器中、還有就是未知錯誤了。

下面我分享一下我的處理方式: @RestControllerAdvice+filter+重寫B(tài)asicErrorController的處理方式。

@RestControllerAdvice

@RestControllerAdvice+@ExceptionHandler(Exception.class)可以處理經(jīng)過controller的異常錯誤

@RestControllerAdvice
public class BaseExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(BaseExceptionHandler.class);
    /**
     * 未知異常
     * @param e 異常
     * @return 統(tǒng)一結(jié)果返回
     */
    @ExceptionHandler(Exception.class)
    public R exception(Exception e) {
        logger.error(e.getMessage(), e);
        return R.error().message(e.getMessage());
    }
    @ExceptionHandler(NoHandlerFoundException.class)
    public R noHandlerFoundException(){
        return R.error().message("當(dāng)前頁面不存在");
    }
}

filter捕獲所有異常

當(dāng)錯誤沒有經(jīng)過controller時(shí),@RestControllerAdvice是不能捕獲的,這時(shí)候就需要在filter進(jìn)行處理。

public class ExceptionHandlerFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){
        try {
            filterChain.doFilter(servletRequest, servletResponse);
        } catch (Exception e) {
            ResponseUtils.out((HttpServletResponse) servletResponse, R.error().message(e.getMessage()));
        }
    }
}

記得filter一定要注冊到springboot才有作用,下面是我喜歡的一種方式

@Bean
FilterRegistrationBean<ExceptionHandlerFilter> exceptionFilterRegistrationBean() {
    FilterRegistrationBean<ExceptionHandlerFilter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new ExceptionHandlerFilter());
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);//放在最前面
    return bean;
}

未知異常處理

當(dāng)發(fā)生的異常不知道在哪時(shí),springboot會進(jìn)行默認(rèn)異常處理,跳轉(zhuǎn)到 /error

這時(shí)我們要統(tǒng)一數(shù)據(jù)返回就必須要從這下手了,創(chuàng)建一個新的Controller處理/error,繼承BasicErrorController,并覆蓋其中的方法

@RestController
public class MyErrorController extends BasicErrorController {
    @Autowired
    public MyErrorController(ErrorAttributes errorAttributes,
                             ServerProperties serverProperties,
                             List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, serverProperties.getError(), errorViewResolvers);
    }
    @Override
    public ModelAndView errorHtml(HttpServletRequest request,
                                  HttpServletResponse response) {
        HttpStatus status = getStatus(request);
        Map<String, Object> model = Collections
                .unmodifiableMap(getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.TEXT_HTML)));
//        return new ModelAndView("error", model, status);
        ResponseUtils.out(response, R.error().code(status.value()).message((String) model.get("error")));
        return null;
    }
    @Override
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
        //可以換成項(xiàng)目中自定義的通信json
        Map<String, Object> resultBody = new HashMap<>(16);
        resultBody.put("success", false);
        resultBody.put("code", body.get("status"));
        resultBody.put("message", body.get("error"));
        Map<String, Object> data = new HashMap<>();
        data.put("timestamp", body.get("timestamp"));
        data.put("path", body.get("path"));
        resultBody.put("data", data);
        return new ResponseEntity<>(resultBody, HttpStatus.OK);
    }
}

配置文件

spring:
  mvc:
    throw-exception-if-no-handler-found: true
  web:
    resources:
      add-mappings: false
server:
  error:
    include-exception: true
  servlet:
    encoding:
      charset: utf-8

統(tǒng)一結(jié)果返回的工具類

ResponseUtils

public class ResponseUtils {
    public static void out(HttpServletResponse response, R r) {
        ObjectMapper mapper = new ObjectMapper();
        response.setStatus(HttpStatus.OK.value());
        response.setContentType("application/json;charset=UTF-8");
        try {
            mapper.writeValue(response.getWriter(), r);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

R

@Data
public class R implements Serializable {
    private boolean success;
    private Integer code;
    private String message;
    private Map<String,Object> data;
    private R(){}
    public static R ok(){
        R r = new R();
        r.setSuccess(true);
        r.setCode(200);
        r.setMessage("成功");
        r.setData(new HashMap<>());
        return r;
    }
    public static R error() {
        R r = new R();
        r.setSuccess(false);
        r.setCode(500);
        r.setMessage("失敗");
        r.setData(new HashMap<>());
        return r;
    }
    public R success(Boolean success){
        this.success = success;
        return this;
    }
    public R code(Integer code){
        this.code = code;
        return this;
    }
    public R message(String message){
        this.message = message;
        return this;
    }
    public R data(String key, Object value){
        this.data.put(key,value);
        return this;
    }
    public R data(Map<String,Object> map){
        this.setData(map);
        return this;
    }
}

到此這篇關(guān)于springboot統(tǒng)一異常處理(返回json)并格式化異常的文章就介紹到這了,更多相關(guān)springboot統(tǒng)一異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇超詳細(xì)的Spring Boot對jdbc支持的文章

    一篇超詳細(xì)的Spring Boot對jdbc支持的文章

    JdbcTemplate 是在JDBC API基礎(chǔ)上提供了更抽象的封裝,并提供了基于方法注解的事務(wù)管理能力。 通過使用SpringBoot自動配置功能并代替我們自動配置beans,下面給大家介紹spring boot中使用JdbcTemplate相關(guān)知識,一起看看吧
    2021-07-07
  • 使用mybatis 實(shí)現(xiàn)量表關(guān)聯(lián)并且統(tǒng)計(jì)數(shù)據(jù)量的步驟和代碼

    使用mybatis 實(shí)現(xiàn)量表關(guān)聯(lián)并且統(tǒng)計(jì)數(shù)據(jù)量的步驟和代碼

    本文介紹了使用SpringBoot+MyBatis+EasyExcel技術(shù)棧實(shí)現(xiàn)數(shù)據(jù)庫查詢結(jié)果導(dǎo)出為Excel文件的步驟,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-10-10
  • springboot集成WebSockets廣播消息(推薦)

    springboot集成WebSockets廣播消息(推薦)

    這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • mybatis多個plugins的執(zhí)行順序解析

    mybatis多個plugins的執(zhí)行順序解析

    這篇文章主要介紹了mybatis多個plugins的執(zhí)行順序解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java8函數(shù)式接口Predicate用法示例詳解

    Java8函數(shù)式接口Predicate用法示例詳解

    這篇文章主要為大家介紹了Java8函數(shù)式接口Predicate用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java中的ArrayList、LinkedList、HashSet等容器詳解

    Java中的ArrayList、LinkedList、HashSet等容器詳解

    這篇文章主要介紹了Java中的ArrayList、LinkedList、HashSet等容器詳解,集合表示一組對象,稱為其元素,有些集合允許重復(fù)元素,而另一些則不允許,有些是有序的,有些是無序的,需要的朋友可以參考下
    2023-08-08
  • java后臺實(shí)現(xiàn)js關(guān)閉本頁面,父頁面指定跳轉(zhuǎn)或刷新操作

    java后臺實(shí)現(xiàn)js關(guān)閉本頁面,父頁面指定跳轉(zhuǎn)或刷新操作

    這篇文章主要介紹了java后臺實(shí)現(xiàn)js關(guān)閉本頁面,父頁面指定跳轉(zhuǎn)或刷新操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • mybatisPlus?FieldStrategy?策略作用小結(jié)

    mybatisPlus?FieldStrategy?策略作用小結(jié)

    MyBatis-Plus的FieldStrategy枚舉用于控制實(shí)體字段在插入、更新和查詢條件中的空值處理策略,下面就來詳細(xì)的介紹一下mybatisPlus?FieldStrategy?策略,感興趣的可以了解一下
    2025-12-12
  • java中l(wèi)ong和Long有什么區(qū)別詳解

    java中l(wèi)ong和Long有什么區(qū)別詳解

    這篇文章主要介紹了Java中l(wèi)ong和Long是基本數(shù)據(jù)類型和包裝數(shù)據(jù)類型的區(qū)別,包括默認(rèn)值、內(nèi)存占用、使用場景、方法支持以及裝箱和拆箱,包裝數(shù)據(jù)類型如Integer提供了許多有用的方法,需要的朋友可以參考下
    2025-02-02
  • Java數(shù)據(jù)結(jié)構(gòu)通關(guān)時(shí)間復(fù)雜度和空間復(fù)雜度

    Java數(shù)據(jù)結(jié)構(gòu)通關(guān)時(shí)間復(fù)雜度和空間復(fù)雜度

    對于一個算法,其時(shí)間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個較好的時(shí)間復(fù)雜度時(shí),可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于Java時(shí)間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論

安龙县| 衢州市| 武宁县| 湾仔区| 通江县| 城固县| 凭祥市| 米泉市| 克东县| 南城县| 宁陵县| 泰和县| 济宁市| 赤水市| 大姚县| 克什克腾旗| 商水县| 罗平县| 南昌县| 万载县| 西充县| 南皮县| 屯门区| 塘沽区| 夏津县| 镇原县| 镇原县| 什邡市| 利辛县| 贺兰县| 安图县| 三河市| 天门市| 西乌| 遂宁市| 淳化县| 从江县| 灌阳县| 华安县| 正镶白旗| 方城县|