日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java后端返回通用接口设计

發布時間:2025/3/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java后端返回通用接口设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我印象中,通用返回接口設計是有兩種方式,第一種是自定義返回數據的通用類,另一種是springboot中實現ResponseBodyAdvice接口,實現返回數據格式的統一,如我說的有錯,請大佬指出。本篇文章主要講解通過springboot實現的方式。

一、自定義返回數據的通用類的方式

這里我推薦這篇文章

二、springboot實現ResponseBodyAdvice接口的方式

  • Entity
  • /*** @author Cristianoxm*/ @Data @AllArgsConstructor @NoArgsConstructor public class User {private long id;private String name;private Integer age; }
  • 通用返回類
  • @Data @AllArgsConstructor @NoArgsConstructor public final class CommonResult<T> {private int status = 1;private String code = "";private String msg = "";private T resultBody;public CommonResult(T resultBody) {this.resultBody = resultBody;}/*** 統一的成功返回方法* @param successCode* @param successMsg* @param resultBody* @param <T>* @return*/public static <T> CommonResult<T> successResult(String successCode,String successMsg,T resultBody){CommonResult<T> commonResult = new CommonResult<>();commonResult.code = successCode;commonResult.msg = successMsg;commonResult.resultBody=resultBody;commonResult.status = 1;return commonResult;}/*** 統一處理異常的方法* @param errorCode* @param errorMsg* @param <T>* @return*/public static <T> CommonResult<T> errorResult(String errorCode, String errorMsg){CommonResult<T> commonResult = new CommonResult<>();commonResult.code = errorCode;commonResult.msg = errorMsg;commonResult.status = -1;return commonResult;} }
  • 自定義處理業務異常類,注意繼承自RuntimeException,用于手動控制拋出異常.
  • /*** @author Cristianoxm*/ @EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor public final class ResponseException extends RuntimeException {private String errorCode;private String errorMsg; }
  • 實現ResponseBodyAdvice接口
  • @EnableWebMvc @Configuration public class UnifiedReturnConfig {@RestControllerAdvice("com.commontest.demo.controller")static class CommonResultResponseAdvice implements ResponseBodyAdvice<Object> {/*** supports方法是來給定條件判斷是否該調用beforeBodyWrite,MethodParameter里面有各種數據* @param methodParameter* @param aClass* @return*/@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {boolean isIntercept = true;Method method = methodParameter.getMethod();assert method != null; // 不攔截@NoResponseAdvice接口AnnotatedElement annotatedElement = methodParameter.getAnnotatedElement();NoResponseAdvice noResponseAdvice = AnnotationUtils.findAnnotation(annotatedElement, NoResponseAdvice.class);if(noResponseAdvice!=null){isIntercept = false;}return isIntercept;}/*** 定義自己返回的數據結構體* @param body 準備處理的返回數據* @param methodParameter 控制層返回的數據結構類型* @param mediaType 通過內容協商選擇內容類型* @param aClass 選擇要寫入響應的轉換器類型* @param serverHttpRequest 當前請求對象* @param serverHttpResponse 返回對象* @return 傳入或修改(可能是新實例)的主體*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {//若是CommonResult類型,直接返回,否則封裝后再返回if (body instanceof CommonResult){return body;}return CommonResult.successResult(StatusAndMsg.SUCCESS.getCode(),StatusAndMsg.SUCCESS.getMsg(),body);}} }
  • 繼承ResponseEntityExceptionHandler,封裝異常(400,404,500)處理
  • @Slf4j @ControllerAdvice public class RestResponseExceptionHandler extends ResponseEntityExceptionHandler {public RestResponseExceptionHandler() {super();}@Overrideprotected ResponseEntity<Object> handleExceptionInternal(Exception e, @Nullable Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {if (e instanceof MissingServletRequestParameterException) {return new ResponseEntity(CommonResult.errorResult("400", e.getMessage()), headers, status);}if (e instanceof NoHandlerFoundException) {return new ResponseEntity(CommonResult.errorResult("404", e.getMessage()), headers, status);}if(e instanceof HttpRequestMethodNotSupportedException){return new ResponseEntity(CommonResult.errorResult("405", e.getMessage()), headers, status);}return new ResponseEntity(CommonResult.errorResult("500", e.getMessage()), headers, status);} }
  • 捕獲自定義的業務異常類
  • /*** @author Cristianoxm*/ @RestControllerAdvice("com.commontest.demo.controller") public class ResponseExceptionHandler{/*** 捕捉自定義異常類* @param responseException* @return*/@ExceptionHandler(ResponseException.class)public CommonResult<Void> handleResponseException(ResponseException responseException){return CommonResult.errorResult(responseException.getErrorCode(), responseException.getErrorMsg());} }
  • 用于注解不經由ResponseAdvice處理的類方法
  • /*** @author Cristianoxm*/ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface NoResponseAdvice { }
  • 狀態碼信息枚舉類
  • public enum StatusAndMsg {SUCCESS("1000", "SUCCESS"),METHODFAIL("2000", "ENCOUNTER AN ERROR WHEN EXECUTE METHOD"),UNKNOWEXCEPTION("3000", "THIS IS AN UNKNOW EXCEPTION");ERROR404("404","There was an unexpected error (type=Bad Request, status=400)"),ERROR500("500","There was an unexpected error (type=Internal Server Error, status=500)");private String code;private String msg;StatusAndMsg(String code, String msg){this.code = code;this.msg = msg;}public String getCode() {return code;}public String getMsg() {return msg;} }
  • 控制器類
  • @RequestMapping("/users") @RestController public class UserController {@GetMapping("/get")public List<User> getUserList(){List<User> userList =new ArrayList<>();userList.add(new User(1l,"messi",23));userList.add(new User(2l,"cristiano",23));return userList;}@GetMapping("/{id}")public User getUserById(@PathVariable Long id){throw new ResponseException(StatusAndMsg.METHODFAIL.getCode(),StatusAndMsg.METHODFAIL.getMsg());}@GetMapping("/getStr")@NoResponseAdvicepublic String paramTest() {return "str";}@GetMapping("/testVoid")@NoResponseAdvicepublic void testVoid(){System.out.println("test void");} }

    注意,不要直接使用Exception捕捉全局異常,不然會導致雖然json返回了404狀態碼,但是http請求的狀態碼仍然是200。參考這篇文章

    三、測試





    如果有啥寫的不好的,麻煩各位大佬指出。
    參考文章
    參考文章
    參考文章
    詳細代碼

    總結

    以上是生活随笔為你收集整理的Java后端返回通用接口设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。