1. 程式人生 > >Spring Boot 2 全域性異常處理

Spring Boot 2 全域性異常處理

1、建立 MyRestControllerAdvice 類,並新增 @RestControllerAdvice
import com.tm.common.dto.Rjson;
import com.tm.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.dao.DataAccessException;
import org.springframework.http.converter.HttpMessageConversionException;
import 
org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 增強器 * 還有一個 @ControllerAdvice, * 他們的區別類似於:@RestController @Controller的區別 * 如果用:@ControllerAdvice
,那麼以下發方法,就要加 @ResponseBody 返回資料 * @author [email protected] * @date 2018/5/22 21:09 */ @Slf4j @RestControllerAdvice public class MyRestControllerAdvice { @ExceptionHandler(RuntimeException.class) public Rjson handleRuntimeException(RuntimeException e){ // http請求異常 if (e instanceof
HttpMessageConversionException){ log.error("Bad Request",e.getMessage(),e); return Rjson.error("Bad Request"); } if (e instanceof AuthorizationException){ log.error("【無操作許可權Shiro",e.getMessage(),e); return Rjson.error(Rjson.CODE_1403,"未授權:操作失敗,請聯絡管理員授權"); } if (e instanceof BusinessException){ log.error("【業務異常】",e.getMessage(),e); return Rjson.error(e.getMessage()); } if (e instanceof DataAccessException){ log.error("【資料庫異常:spring-dao",e.getMessage(),e); return Rjson.error("DB異常,請聯絡管理員"); } log.error("【其他RuntimeException",e.getMessage(),e); return Rjson.error(); } /** 全域性異常捕捉處理 */ @ExceptionHandler(Exception.class) public Rjson handleException(Exception e){ if (e instanceof HttpRequestMethodNotSupportedException){ return Rjson.error("不支援的請求方式/"+e.getMessage()); } log.error("【未知異常】:"+e.getMessage(), e); return Rjson.error(); } }
2、建立通用,統一的的返回物件
import java.io.Serializable;

/**
 * 通用的返回物件
* @author [email protected]
 * @date   2018/4/13 14:08
 */
public class Rjson implements Serializable{

    /**
     * ajax響應編碼,200 表示正常請求,不存在非授權或者未登入請求
*/
public static final int CODE_DEF = 200;

    /**
     * 未登入,前端判斷後,跳轉到登入頁面
*/
public static final int CODE_1100 = 1100;

    /**
     * 無權訪問
*/
public static final int CODE_1403 = 1403;

    private Integer code = CODE_DEF;

    private Boolean success = false;

    private String msg;

    private Object obj;

    public Integer getCode() {
        return code;
    }

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

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public static Rjson error(){
        Rjson r = new Rjson();
        r.setMsg("系統異常,請稍後重試");
        return r;
    }
    public static Rjson error(String msg){
        Rjson r = new Rjson();
        r.setMsg(msg == null ? "系統異常,請稍後重試" : msg);
        return r;
    }
    public static Rjson error(int code,String msg){
        Rjson r = new Rjson();
        r.setCode(code);
        r.setMsg(msg == null ? "系統異常,請稍後重試" : msg);
        return r;
    }
    public static Rjson ok() {
        Rjson r = new Rjson();
        r.setSuccess(true);
        return r;
    }
    public static Rjson ok(String msg) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setMsg(msg);
        return r;
    }
    public static Rjson ok(Object obj) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setObj(obj);
        return r;
    }
    public static Rjson ok(Object obj,String msg) {
        Rjson r = new Rjson();
        r.setSuccess(true);
        r.setObj(obj);
        r.setMsg(msg);
        return r;
    }
}
3、新增完上面的配置之後,我們在controller類中,可以不新增 try...catch... 模組了。
如果出現異常,那麼會進入 MyRestControllerAdvice 處理,並返回對應的錯誤資訊。前端頁面不會看到
後臺直接丟擲的異常資訊。
import com.baomidou.mybatisplus.mapper.Condition;
import com.tm.auth.entity.SysUser;
import com.tm.auth.service.SysUserService;
import com.tm.common.controller.BaseController;
import com.tm.common.dto.Rjson;
import com.tm.common.validator.ValidatorUtils;
import com.tm.common.validator.group.AddGroup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p> *  使用者管理* </p> *
 * @author tomao2014qq.com
 * @since 2018-05-18
 */
@Slf4j
@RestController
@RequestMapping("/sys/user")
public class SysUserController extends BaseController {

    @Autowired
private SysUserService sysUserService;

    @PostMapping("/add")
    public Rjson add(@RequestBody SysUser user){
        ValidatorUtils.validateEntity(user,AddGroup.class);
        sysUserService.add(user);
        return Rjson.ok();
    }
}
如果在controller類中添加了 try...catch... 如果處理過程中,出現異常,那麼返回的是 controller
中我們指定catch中的資訊。
@PostMapping("/add")
public Rjson add(@RequestBody SysUser user){
    try {
        ValidatorUtils.validateEntity(user,AddGroup.class);
        sysUserService.add(user);
    }catch (Exception e){
        return Rjson.error("返回的異常資訊,是我!");
    }
    return Rjson.ok();
}

參考資料:

https://www.cnblogs.com/magicalSam/p/7198420.html

https://www.cnblogs.com/nosqlcoco/p/5562107.html

https://blog.csdn.net/flygoa/article/details/75284755


相關推薦

Spring Boot 2 全域性異常處理

1、建立 MyRestControllerAdvice 類,並新增 @RestControllerAdviceimport com.tm.common.dto.Rjson; import com.tm.common.exception.BusinessException; i

spring boot 2 統一異常處理

auto cati uil extend 代碼 自定義error view empty framework spring mvc 針對controller層異常統一處理非常簡單,使用 @RestControllerAdvice 或 @RestControllerAdvice

Spring Boot學習——統一異常處理

return 方法 ssa static framework 處理異常 tor ebo except 本隨筆記錄使用Spring Boot統一處理異常。 本文實例是從數據庫中根據ID查詢學生信息,要求學生的年齡在14——20歲之間。小於14歲,提

Spring Boot-全局異常處理(八)

set temp ajax tac itl resp produce lec div SpringBoot默認異常默認處理機制 Spring boot錯誤異常時通過BasicErrorController來處理的 通過判斷是瀏覽器請求還是ajax請求響應頁面或者json

spring boot中統一異常處理

在前面的部落格中,Spring Boot整合jpa,Shiro進行許可權管理 異常都是直接返回到頁面上,這樣做既不安全,也不友好,所以在返回給頁面之前,我們需要對異常資訊進行統一的處理,該部分的處理思路和spring mvc的處理思路是一致的。 下面,我們來對前面的示例進

實戰分析:Spring boot &&Freemarker統一異常處理FreeMarker template error

在Freemarker頁面中如果使用${userName}, 並且userName為空,那麼Freemarker頁面就會崩掉 需要設定預設值${userName!}來避免物件為空的錯誤。 同理 ${user.userName}也應該寫成這樣${(user.userN

spring boot全域性異常的定義

全域性異常 import com.alibaba.fastjson.JSON; import com.ziku.msp.common_enum.ErrorCodeEnum; import com.ziku.msp.exception.BizException; import

spring boot 中統一異常處理

map handler this internal col message static pub 處理 基於 spring boot 對異常處理的不友好,現在通過其他的方式來統一處理異常 步驟一:自定義異常類 public class UserNotExistExc

基於Spring Boot的統一異常處理設計

基於Spring Boot的統一異常處理設計 作者: Grey 原文地址:https://www.cnblogs.com/greyzeng/p/11733327.html Spring Boot中,支援RestControllerAdvice統一處理異常,在一個請求響應週期當中,如果Controller,Se

Spring Boot 2 Webflux的全域性異常處理

本文首先將會回顧Spring 5之前的SpringMVC異常處理機制,然後主要講解Spring Boot 2 Webflux的全域性異常處理機制。 SpringMVC的異常處理 Spring 統一異常處理有 3 種方式,分別為: 使用 @ExceptionHandler 註解 實現 Handl

Spring Boot 2.X(十一):全域性異常處理

前言 在 Java Web 系統開發中,不管是 Controller 層、Service 層還是 Dao 層,都有可能丟擲異常。如果在每個方法中加上各種 try catch 的異常處理程式碼,那樣會使程式碼非常繁瑣。在Spring MVC 中,我們可以將所有型別的異常處理從各個單獨的方法中解耦出來,進行異常資

spring boot 統一返回資料及全域性異常處理

記錄關於spring boot 統一返回資料及全域性異常處理的操作實現。 一、統一返回資料 1、定義一個超類:BaseResponseVo @Data @NoArgsConstructor public class BaseResponseVo{ protected Integer r

Spring Boot-錯誤處理及自定義全域性異常處理機制

正常的Web應用開發時,需要考慮到應用執行發生異常時或出現錯誤時如何來被處理,例如捕獲必要的異常資訊,記錄日誌方便日後排錯,友好的使用者響應輸出等等。 當然應用發生錯誤,有可能是應用自身的問題,也有可能是客戶端操作的問題。 Spring Boot預設提供了一種錯誤處理機制。 預設錯誤處理機制

Spring Boot 全域性異常處理 與 Hibernate Validator校驗框架整合

Hibernate Validator校驗框架的使用 Spring boot已經集成了hibernate-validator,不需要引入maven,其他框架也可以自己引入: <dependency> <groupId>org.h

Spring Boot 統一返回資料結構以及全域性異常處理

前言 看了廖師兄的視訊後,結合自己以前的程式設計經驗總結下 : 在 web 開發過程中, 後端要統一返回的資料結構,便於前端處理。例如每個請求,我們都需要知道 : code : 伺服器返回的狀態碼(主要給程式設計師看)。例如 : 200 : 請求成功。

Spring Boot 學習筆記(十三)——全域性異常處理

預設異常處理機制 1、Whitelabel Error Page 當客戶端訪問頁面不存在,或服務端處理髮生異常,一般瀏覽器客戶端傳送的請求頭中為:Accept:text/html;所以就返回一個html文件。 這裡有一個很重要的類:BasicErrorContr

springboot全域性異常處理(包含404錯誤處理) 一:解決spring boot中rest介面404,500等錯誤返回統一的json格式(備用地址) 二:SpringBoot入門——區域性與全域性異常處理(備用地址)

個人整理參考文件: 一:解決spring boot中rest介面404,500等錯誤返回統一的json格式(備用地址) 二:SpringBoot入門——區域性與全域性的異常處理(備用地址) 三:SpringBoot全域性異常處理(備用地址) 四:sprin

spring boot 全域性異常處理及自定義異常

全域性異常處理:定義一個處理類,使用@ControllerAdvice註解。@ControllerAdvice註解:控制器增強,一個被@Component註冊的元件。配合@ExceptionHandler來增強所有的@requestMapping方法。例如:@Exceptio

Spring Boot 菜鳥教程 6 全域性異常處理

GitHub @ControllerAdvice原始碼 package org.springframework.web.bind.annotation; import java.lang.annotation.Annotation; impor

9.玩轉Spring Boot 全域性異常處理@ControllerAdvice

玩轉Spring Boot 全域性異常處理@ControllerAdvice       在開發中出現異常後,可能需要一個統一處理的地方,來處理程式出現的異常,針對不同的異常做不同的處理,這裡我們通過@ExceptionHandler註解來實現。在WEB開發中,比如頁面出