当前位置: 首页 > 科技观察

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

时间:2023-03-17 18:25:25 科技观察

统一SpringBoot中RestfulAPI的返回值格式,统一处理异常,只需要一步,而且还可以让前端统一处理很多事情,避免很多问题。比较通用的返回值格式如下:publicclassResult{//接口调用成功或失败privateIntegercode=0;//失败的具体代码privateStringerrorCode="";//需要传递的信息,比如报错信息privateStringmsg;//需要传privateTdata;...}最原始的接口如下:@GetMapping("/test")publicUsertest(){returnnewUser();}当我们需要返回一个统一的值,我们可能会用到这样一个方法:@GetMapping("/test")publicResulttest(){returnResult.success(newUser());}这个方法确实达到了统一接口返回值的目的,但是新的几个问题已经产生:接口的返回值不明显,一眼看不到这个接口的返回值。每个接口都需要额外的代码量。幸运的是,SpringBoot为我们提供了更好的解决方案。我们只需要在项目中加入如下代码,就可以在没有感知的情况下为我们统一全局返回值。/***全局返回值统一封装*/@EnableWebMvc@ConfigurationpublicclassGlobalReturnConfig{@RestControllerAdvicestaticclassResultResponseAdviceimplementsResponseBodyAdvice{@Overridepublicbooleansupports(MethodParametermethodParameter,Class>aClass){returntrue;}@OverridepublicObjectbeforeBodyWrite(Objectbody,MethodParametermethodParameter,MediaTypemediaType,Class>aClass,ServerHttpRequestserverHttpRequest,ServerHttpResponseserverHttpResponse){if(bodyinstanceofResult){returnbody;}returnnewResult(body);}}}而我们的接口只需要写成最原始的形式即可。@GetMapping("/test")publicUsertest(){returnnewUser();}统一处理异常在统一封装返回值的时候,我们没有考虑接口抛出异常的情况。当接口抛出异常时,用户直接在服务端看到异常肯定不够友好,我们也不可能去每个接口都去try/catch去处理。这时候我们只需要使用@ExceptionHandler注解就可以实现一个非感知的全局统一处理异常。@RestControllerAdvicepublicclassGlobalExceptionHandler{privatestaticfinalLoggerLOG=LoggerFactory.getLogger(GlobalExceptionHandler.class);/***全局异常处理*/@ExceptionHandlerpublicJsonDatahandleException(HttpServletRequestrequest,HttpServletResponseresponse,finalExceptione){Allog.error(e.getifeinstance(),e);{//可以在前端Alert的异常if(((AlertException)e).getRetCode()!=null){//预定义异常returnnewResult(((AlertException)e).getRetCode());}else{returnnewResult(1,e.getMessage()!=null?e.getMessage():"");}}else{//其他异常if(Util.isProduct()){//如果是正式环境,统一提示returnnewResult(RetCode.ERROR);}else{//测试环境,告警异常信息returnnewResult(1,StringUtils.isNotBlank(e.getMessage())?e.getMessage():e.toString());}}}}AlertException是我们自定义的异常,所以当业务需要抛出错误时,可以手动抛出AlertException。以上就是统一处理返回值和统一处理异常的两个步骤。