您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“SpringBoot怎么返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
期望返回的JSON格式如下
{ "code": 200, "msg": "操作成功", "data": "hello jenkins" }
實(shí)現(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的增強(qiáng)類,可用于實(shí)現(xiàn)全局異常處理器 |
@ExceptionHandler | 統(tǒng)一處理某一類異常,從而減少代碼重復(fù)率和復(fù)雜度,比如要獲取自定義異常可以@ExceptionHandler(BusinessException.class) |
@ResponseStatus | 指定客戶端收到的http狀態(tài)碼 |
注:請求進(jìn)來 會按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調(diào)用,
404異常(NoHandlerFoundException)是無法通過這種方式捕獲的,因?yàn)樵贔ilter層發(fā)生的異常都會到Spring默認(rèn)的異常處理。如果你在配置文件配置了server.error.path的話,就會使用你配置的異常處理地址,如果沒有就會使用你配置的error.path路徑地址,如果還是沒有,默認(rèn)使用/error來作為發(fā)生異常的處理地址。如果想要替換默認(rèn)的非Controller異常處理直接實(shí)現(xiàn)Spring提供的ErrorController接口就行了。
4.攔截Controller方法的返回值,統(tǒng)一處理返回值/響應(yīng)體,因?yàn)槲覀兒竺婷繉懸粋€接口都需要調(diào)用ApiResult.success()這行代碼對結(jié)果進(jìn)行包裝,重復(fù)勞動,浪費(fèi)體力,我們只需要實(shí)現(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ù)進(jìn)行處理 */ @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 "當(dāng)前時間:" + 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方法時控制臺打印異常信息如下
“SpringBoot怎么返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。