1. 程式人生 > 程式設計 >Spring Boot 捕捉全域性異常 統一返回值的問題

Spring Boot 捕捉全域性異常 統一返回值的問題

在前後端分離的情況下,我們經常會定義一個統一的反回資料格式,通常都會包含狀態碼,返回資訊,返回的資料,是否成功等引數。

1、ResultCode

單獨定義了一個ReturnCode列舉類用於儲存程式碼和返回的Message

public enum ResultCode {
 //成功
 SUCCESS(200),// 失敗
 FAIL(400),// 未認證(簽名錯誤)
 UNAUTHORIZED(401),// 介面不存在
 NOT_FOUND(404),// 伺服器內部錯誤
 INTERNAL_SERVER_ERROR(500);
 public int code;
 ResultCode(int code)
 {
  this.code=code;
 }
}

2、ResponseResult

/*
 統一返回資訊
 */
public class ResponseResult<T> {
 public int code; //返回狀態碼200成功
 
 private String msg; //返回描述資訊
 
 private T data; //返回內容體
 
 public ResponseResult<T> setCode(ResultCode retCode) {
  this.code = retCode.code;
  return this;
 }
 
 public int getCode() {
  return code;
 }
 
 public ResponseResult<T> setCode(int code) {
  this.code = code;
  return this;
 }
 
 public String getMsg() {
  return msg;
 }
 
 public ResponseResult<T> setMsg(String msg) {
  this.msg = msg;
  return this;
 }
 
 public T getData() {
  return data;
 }
 
 public ResponseResult<T> setData(T data) {
  this.data = data;
  return this;
 }
 
}

在定義一個統一返回類:

3、Response

public class Response {
 private final static String SUCCESS = "success";
 
 private final static String FAIL = "fail";
 
 public static <T> ResponseResult<T> makeOKRsp() {
  return new ResponseResult<T>().setCode(ResultCode.SUCCESS).setMsg(SUCCESS);
 }
 
 public static <T> ResponseResult<T> makeOKRsp(String message) {
  return new ResponseResult<T>().setCode(ResultCode.SUCCESS).setMsg(message);
 }
 
 public static <T> ResponseResult<T> makeOKRsp(T data) {
  return new ResponseResult<T>().setCode(ResultCode.SUCCESS).setMsg(SUCCESS).setData(data);
 }
 
 public static <T> ResponseResult<T> makeErrRsp(String message) {
  return new ResponseResult<T>().setCode(ResultCode.INTERNAL_SERVER_ERROR).setMsg(message);
 }
 
 public static <T> ResponseResult<T> makeRsp(int code,String msg) {
  return new ResponseResult<T>().setCode(code).setMsg(msg);
 }
 
 public static <T> ResponseResult<T> makeRsp(int code,String msg,T data) {
  return new ResponseResult<T>().setCode(code).setMsg(msg).setData(data);
 }
}

4、新建IUserService

新建測試使用者介面類

package com.example.demo.service;
import com.example.demo.entity.User;
public interface IUserService {
 public User getUserInfo();
}

5、新建UserServiceImpl

新建測試使用者資訊服務類

package com.example.demo.service.impl;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
 
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;
 
@Service
public class UserServiceImpl implements IUserService {
 public User getUserInfo(){
  User user = new User();
  user.setName("jack");
  user.setPassword(12341234);
 
  return user;
 }
 
}

6、在controller呼叫

@Autowired
 UserService service;
 @RequestMapping(value = "/getUserItem",method = RequestMethod.GET)
 public ResponseResult<User> getUserItem(){
  try {
   User user = service.getUserInfo();
   String[] arr= new String[]{"測試"};
   return Response.makeOKRsp(user);
  }catch (Exception e)
  {
   return Response.makeErrRsp("查詢使用者資訊異常");
  }
 }

返回結果:

Spring Boot 捕捉全域性異常 統一返回值的問題

7、全域性異常處理器

/**
 * 全域性異常處理
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
 
 /*============= 請求錯誤 start ==============================================*/
 
 /**
  * HTTP 請求方式不支援異常
  * HttpRequestMethodNotSupportedException
  * @return {@link ResponseResult}
  */
 @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
 public ResponseResult httpRequestMethodNotSupportException(HttpRequestMethodNotSupportedException e,HttpServletRequest request) {
  return Response.makeErrRsp("請求方式不支援異常");
 }
 
 /*============= 請求錯誤 end ==============================================*/
 
}

修改一下getUserItem讓其丟擲自定義查詢返回null的異常:

Spring Boot 捕捉全域性異常 統一返回值的問題

總結

到此這篇關於Spring Boot 捕捉全域性異常 統一返回值的文章就介紹到這了,更多相關Spring Boot 捕捉全域性異常 內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!