SpringBoot返回統(tǒng)一的JSON標準格式實現(xiàn)步驟
期望返回的JSON格式如下
{
"code": 200,
"msg": "操作成功",
"data": "hello jenkins"
}
實現(xiàn)步驟如下
1.自定義狀態(tài)碼枚舉類。
@AllArgsConstructor
@Getter
public enum StatusCodeEnum {
SC200(200, "操作成功"),
SC999(999, "操作失敗"),
SC401(401, "匿名用戶訪問權(quán)限資源時的異常"),
SC403(403, "無訪問權(quán)限,請聯(lián)系管理員授予權(quán)限"),
SC404(404, "請求的資源不存在"),
SC500(500, "系統(tǒng)異常,請稍后重試"),
// ...略
private final Integer code;
private final String msg;
}
2.封裝返回結(jié)果
@Data
public class ApiResult<T> implements Serializable {
private Integer code;
private String msg;
private T data;
public 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的增強類,可用于實現(xiàn)全局異常處理器 |
| @ExceptionHandler | 統(tǒng)一處理某一類異常,從而減少代碼重復(fù)率和復(fù)雜度,比如要獲取自定義異常可以@ExceptionHandler(BusinessException.class) |
| @ResponseStatus | 指定客戶端收到的http狀態(tài)碼 |
注:請求進來 會按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調(diào)用,
404異常(NoHandlerFoundException)是無法通過這種方式捕獲的,因為在Filter層發(fā)生的異常都會到Spring默認的異常處理。如果你在配置文件配置了server.error.path的話,就會使用你配置的異常處理地址,如果沒有就會使用你配置的error.path路徑地址,如果還是沒有,默認使用/error來作為發(fā)生異常的處理地址。如果想要替換默認的非Controller異常處理直接實現(xiàn)Spring提供的ErrorController接口就行了。
4.攔截Controller方法的返回值,統(tǒng)一處理返回值/響應(yīng)體,因為我們后面每寫一個接口都需要調(diào)用ApiResult.success()這行代碼對結(jié)果進行包裝,重復(fù)勞動,浪費體力,我們只需要實現(xiàn)SpringBoot提供的ResponseBodyAdvice接口即可。
@RestControllerAdvice
public class ApiResultWrapper implements ResponseBodyAdvice<Object> {
/**
* 是否支持advice功能
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
/**
* 對返回的數(shù)據(jù)進行處理
*/
@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));
}
// 這個判斷的作用:防止全局異常處理后返回的結(jié)果(類型為ApiResult)再次被包裝
if (o instanceof ApiResult) {
return o;
}
return ApiResult.success(o);
}
}
5.創(chuàng)建Controller,定義兩個方法,讓第二個方法拋異常
@RestController
public class TestController {
@GetMapping("/test1")
public String test1() {
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,結(jié)果如下


在全局異常處理類中寫了一行代碼
log.error("全局異常信息:{}", e.getMessage());
所以調(diào)用test2方法時控制臺打印異常信息如下

到此這篇關(guān)于SpringBoot返回統(tǒng)一的JSON標準格式的文章就介紹到這了,更多相關(guān)SpringBoot返回JSON格式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用設(shè)計模式中迭代器模式構(gòu)建項目的代碼結(jié)構(gòu)示例
這篇文章主要介紹了Java使用設(shè)計模式中迭代器模式構(gòu)建項目的代碼結(jié)構(gòu)示例,迭代器模式能夠?qū)υL問者隱藏對象的內(nèi)部細節(jié),需要的朋友可以參考下2016-05-05
spring aop之@AfterReturning不生效問題及解決
這篇文章主要介紹了spring aop之@AfterReturning不生效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot定時任務(wù)設(shè)計之時間輪案例原理詳解
這篇文章主要為大家介紹了SpringBoot定時任務(wù)設(shè)計之時間輪案例原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Java中l(wèi)ambda表達式實現(xiàn)aop切面功能
本文主要介紹了Java中l(wèi)ambda表達式實現(xiàn)aop切面功能,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02

