SpringBoot統一數據返回模板---全局異常處理

一、統一數據返回模板

創建一個消息類Message.java,代碼如下

package com.ws.demo.vo;

import com.ws.demo.enumClass.CallType;

public class Message {

    //調用結果類型
    private CallType callType;
    //消息
    private String msg;
    //數據
    private Object data;
    //狀態碼
    private Integer status;
    //異常鏈接
    private String url;

	/**
	 * 此處省略  get set toString
	 **/
    
    public Message() {
    }

    /**
     * 錯誤返回
     * @param callType
     * @param msg
     */
    public Message(CallType callType, String msg, Integer status, String url) {
        this.callType = callType;
        this.msg = msg;
        this.status = status;
        this.url = url;
    }

    /**
     * 成功返回
     * @param callType
     * @param msg
     * @param data
     */
    public Message(CallType callType, String msg, Object data, Integer status) {
        this.callType = callType;
        this.msg = msg;
        this.data = data;
        this.status = status;
    }

    /**
     * 返回成功消息
     * @param data  返回數據
     * @return
     */
    public static Message success(Object data){
        return new Message(CallType.success,"操作成功!",data,0);
    }

    /**
     * 返回失敗消息
     * @param msg
     * @return
     */
    public static Message unsuccess(String msg,String url){
        return new Message(CallType.error,msg,-1,url);
    }
}

創建調用結果狀態枚舉類CallType.java,代碼如下

package com.ws.demo.enumClass;

public enum CallType {
    success,
    warn,
    error;
}

來測試一下吧

@RestController
public class TestController {

    @RequestMapping("testMessage")
    public Message testMessage(){
        //SocketMsg爲一個實體類
        SocketMsg sm = null;
        try {
            sm = null;
            sm = new SocketMsg();
            sm.setFromUser("LFQ");
            sm.setMsg("我來了!");
            sm.setToUser("YXX");
            sm.setType(1);
            //此處模擬代碼出現異常
            //int flag = 1 / 0;
        } catch (Exception e) {
        	//失敗狀態下調用unsuccess方法
            return Message.unsuccess(e.getMessage(),request.getRequestURI());
        }
        //成功狀態下調用success方法
        return Message.success(sm);
    }
}

效果如下:
在這裏插入圖片描述

二、全局異常處理

1、定義一個異常類HospitalException.java,繼承Exception

public class HospitalException extends Exception{
    public HospitalException(String message) {
        super(message);
    }
}

2、創建自定義異常類型枚舉類ExceptionType.java

public enum ExceptionType {
    SqlException("數據庫異常!"),
    ServiceException("算法服務調用失敗!"),
    NullException("未知異常!");
    
    private String msg;
    
    ExceptionType(String msg) {
        this.msg = msg;
    }
    
    public String getMsg() {return msg;}
    public void setMsg(String msg) {this.msg = msg;}
}

3、配置全局異常處理器,處理HospitalException

@Configuration
@ControllerAdvice
public class ExceptionController {

    /**
     * //異常處理器,處理HospitalException異常
     * @param request
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = HospitalException.class)
    public ResponseEntity<?> hanlerException(HttpServletRequest request, HospitalException e){
    	//返回自定義消息
        Message error = Message.unsuccess(e.getMessage(),request.getRequestURI());
        return new ResponseEntity<>(error, HttpStatus.OK);
    }
}

4、來測試一下吧

@RestController
public class TestController {

    @RequestMapping("testMessage")
    public Message testMessage(HttpServletRequest request)throws HospitalException{

        SocketMsg sm = null;
        try {
            sm = null;
            sm = new SocketMsg();
            sm.setFromUser("LFQ");
            sm.setMsg("我來了!");
            sm.setToUser("YXX");
            sm.setType(1);
            //模擬出現異常
            int flag = 1 / 0;
        } catch (Exception e) {
            ExceptionType et = ExceptionType.NullException;
            //這裏消息也可以是系統異常消息
            throw new HospitalException(et.getMsg());
        }
        return Message.success(sm);
    }
}

效果如下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章