springboot返回統一介面與統一異常處理 編寫人員: yls 編寫時間:2019 9 19 1. 0001 springboot返回統一介面與統一異常處理 1. "簡介" 1. "創建統一的返回格式 Result" 1. "封裝統一返回格式工具類ResultUtil" 1. "測試用的實體類U ...
springboot返回統一介面與統一異常處理
編寫人員:yls
編寫時間:2019-9-19
- 0001-springboot返回統一介面與統一異常處理
簡介
在做後端服務開發時,想要每次獲取的數據和拋出的異常保持統一的返回結果,結構清晰,方便管理
創建統一的返回格式 Result
package com.example.itokenserviceadmin.config.baseResult;
import lombok.Data;
/**
* http請求最外層對象,統一返回介面
* @param <T>
*/
@Data
public class Result<T> {
//返回碼
private Integer code;
//提示信息
private String msg;
//返回具體內容
private T data;
}
封裝統一返回格式工具類ResultUtil
package com.example.itokenserviceadmin.utils;
import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException;
/**
* 統一返回介面的工具類
*/
public class ResultUtil {
public static Result success(Object object) {
Result result = new Result();
result.setCode(ResultEnum.SUCCESS.getCode());
result.setMsg(ResultEnum.SUCCESS.getMsg());
result.setData(object);
return result;
}
public static Result success() {
return success(null);
}
public static Result error(Integer code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
public static Result error(ResultEnum resultEnum) {
return error(resultEnum.getCode(),resultEnum.getMsg());
}
public static Result error(UserException userException) {
return error(userException.getCode(),userException.getMessage());
}
}
測試用的實體類User
package com.example.itokenwebadmin.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private String id;
private String name;
private String password;
}
使用枚舉統一管理返回碼和返回信息
package com.example.itokenserviceadmin.config.exceptionHandle;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 在自定義異常的錯誤碼和信息時,如果過多,沒有統一管理,則會出現重覆。
* 使用枚舉統一管理code和message:
*/
@Getter
@AllArgsConstructor
public enum ResultEnum {
UNKNOW_ERROR(-1, "未知錯誤"),
SUCCESS(0, "成功");
private Integer code;
private String msg;
}
自定義異常類
package com.example.itokenserviceadmin.config.exceptionHandle;
import lombok.Data;
@Data
public class UserException extends RuntimeException {
/**
* 我們希望定位的錯誤更準確,
* 希望不同的錯誤可以返回不同的錯誤碼,所以可以自定義一個Exception
*
*
* 註意要繼承自RuntimeException,底層RuntimeException繼承了Exception,
* spring框架只對拋出的異常是RuntimeException才會進行事務回滾,
* 如果是拋出的是Exception,是不會進行事物回滾的
*/
public UserException(ResultEnum resultEnum) {
super(resultEnum.getMsg());
this.code = resultEnum.getCode();
}
private Integer code;
}
統一異常處理
package com.example.itokenserviceadmin.config.exceptionHandle;
import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 統一異常處理
*/
@ControllerAdvice
public class ExceptionHandle {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {
if (e instanceof UserException) {
UserException userException = (UserException) e;
return ResultUtil.error(userException);
} else {
return ResultUtil.error(-1, e.getMessage());
}
}
}
創建UserController
package com.example.itokenserviceadmin.controller;
import com.example.itokenserviceadmin.config.baseResult.Result;
import com.example.itokenserviceadmin.config.exceptionHandle.ResultEnum;
import com.example.itokenserviceadmin.config.exceptionHandle.UserException;
import com.example.itokenserviceadmin.entity.User;
import com.example.itokenserviceadmin.service.UserService;
import com.example.itokenserviceadmin.serviceImpl.UserImpl;
import com.example.itokenserviceadmin.utils.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/success")
public Result<User> success(User user){
user.setId("3");
return ResultUtil.success(user);
}
@RequestMapping("/err")
public Result err(){
return ResultUtil.error(ResultEnum.UNKNOW_ERROR);
}
@RequestMapping("/exception")
public void exception() throws Exception {
throw new UserException(ResultEnum.UNKNOW_ERROR);
}
}