SpringBoot返回統一的JSON標準格式實現步驟
期望返回的ON格式如下
{ "code": 200,"msg": "操作成功","data": "hello jenkins" }
實現步驟如下
1.自定義狀態碼列舉類。
@AllArgsConstructor @Getter public enum StatusCodeEnum { SC200(200,"操作成功"),SC999(999,"操作失敗"),SC401(401,"匿名使用者訪問許可權資源時的異常"),SC403(403,"無訪問許可權,請聯絡管理員授予許可權"),SC404(404,"請求的資源不存在"),SC500(500,"系統異常,請稍後重試"),// ...略 private final Integer code; private final String msg; }
2.封裝返回結果
@Data
public class ApiResult<T> implements Serializable {
private Integer code;
private String msg;
private T data;
publhttp://www.cppcns.comic static <T> ApiResult<T> success(T data) {
return ApiResult.success(StatusCodeEnum.SC200.getMsg(),data);
}
public static <T> ApiResult<T> success(String msg,T data) {
ApiResult<T> apiResult = new ApiResult<>();
apiResult.setCode(StatusCodeEnum.SC200.getCode());
apiResult.setMsg(msg);
apiResult.setData(data);
return apiResult;
}
public static <T> ApiResult<T> fail(Integer code,String msg) {
ApiResult<T> apiResult = new ApiResult<>();
apiResult.setCode(code);
apiResult.setMsg(msg);
return apiResult;
}
}
3.全域性異常捕獲處理,使用@RestControllerAdvice註解。
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /** * 捕獲其他異常 */ @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) public ApiResult<String> handle(Exception e) { log.error("全域性異常資訊:{}",e.getMessage()); return ApiResult.fail(StatusCodeEnum.SC500.getCode(),StatusCodeEnum.SC500.getMsg()); } }
註解 | 功能 |
---|---|
@RestControllerAdvice | RestController的增強類,可用於實現全域性異常處理器 |
@ExceptionHandler | 統一處理某一類異常,從而減少程式碼重複率和複雜度,比如要獲取自定義異常可以@ExceptionHandler(BusinessException.class) |
@ResponseStatus | 指定客戶端收到的http狀態碼 |
注:請求進來 會按照 filter -> interceptor -> controllerAdvice -> aspect -> controlnEXVwler的順序呼叫,
404異常(NoHandlerFoundException)是無法通過這種方式捕獲的,因為在Filter層發生的異常都會到Spring預設的異常處理。如果你在配置檔案配置了server.error.path的話,就會使用你配置的異常處理地址,如果沒有就會使用你配置的error.path路徑地址,如果還是沒有,預設使用/error來作為發生異常的處理地址。如果想要替換預設的非Controller異常處理直接實現Spring提供的ErrorController介面就行了。
4.攔截Controller方法的返回值,統一處理返回值/響應體,因為我們後面每寫一個介面都需要呼叫ApiResult.success()這行程式碼對結果進行包裝,重複勞動,浪費體力,我們只需要實現SpringBoot提供的ResponseBodyAdvice介面即可。
@RestControllerAdvice public class ApiResultWrapper implements ResponseBodyAdvice<Object> { /** * 是否支援advice功能 */ @Override public boolean supports(MethodParameter methodParameter,Class<? extends HttpMessageConverter<?>> aClass) { return true; } /** * 對返回的資料進行處理 */ @Override public Object beforeBodyWrite(Object o,MethodParameter methodParameter,MediaType mediaType,Class<? extends HttpMessageConverter<?>> aClass,ServerHttpRequest serverHttpRequest,ServerHttpResponse serverHttpResponse) { if (o instanceof String) { return JSON.toJSONString(ApiResult.success(o)); } // 這個判斷的作用:防止全域性異常處理後返回的結果(型別為ApiResult)再次被包裝 if (o instanceof ApiResult) { return o; } return ApiResult.success(o); } }
5.建立Controller,定義兩個方法,讓第二個方法拋異常
@RestController
public class TestController {
@GetMapping("/test1")
public String testwww.cppcns.com1() {
return "當前時間:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@GetMapping("/test2")
public Integer test2() {
System.out.println(1 / 0);
return Integer.MAX_VALUE;
}
}
6.分別請求http://localhost:8080/test1、http://localhost:8080/test2,結果如下
在全域性異常處理類中寫了一行程式碼
log.error("全域性異常資訊:{}",e.getMessage());
所以呼叫test2方法時控制檯列印異常資訊如下
到此這篇關於SpringBoot返回統一的JSON標準格式的文章就介紹到這了,更多相關SpringBoot返回JSON格式內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!