如何处理SpringBoot统一返回格式
导读:本文共5269字符,通常情况下阅读需要18分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:希望大家仔细阅读,能够学有所成!背景相信大部分后端开发人员在日常开发中都需要和前端对接,当然前后端都是你自己一个人搞的话可以想怎么玩就怎么玩,但是我们还是要做到一定的规范性。在前后端分离的项目中后端返回的格式一定要友好,并且固定,不能经常变来变去,不然会对前端的开发人员带来很多的工作量。SpringBoot Controller 常见的返回格式String@PostMapping("/t... ...
目录
(为您整理了一些要点),点击可以直达。希望大家仔细阅读,能够学有所成!
背景
相信大部分后端开发人员在日常开发中都需要和前端对接,当然前后端都是你自己一个人搞的话可以想怎么玩就怎么玩,但是我们还是要做到一定的规范性。在前后端分离的项目中后端返回的格式一定要友好,并且固定,不能经常变来变去,不然会对前端的开发人员带来很多的工作量。
SpringBoot Controller 常见的返回格式
String
@PostMapping("/test")
publicStringtest(){
return"HelloWorld";
}
postman调用结果:
自定义对象
正常返回
@PostMapping("/getUser")
publicActionResultgetUser(){
Useruser=newUser();
user.setId(UUID.randomUUID().toString());
user.setName("MrDong");
user.setAge(20);
returnActionResult.defaultOk(user);
}
postman调用结果:
错误返回
@PostMapping("/error")
publicActionResulterror(){
returnActionResult.defaultFail(1000,"服务器异常,请联系管理员");
}
postman调用结果:
定义返回对象
我定义两个ActionResult这个对象来对返回值进行封装,可以根据自己公司实际情况修改:
packagecom.wxd.entity;
importcom.wxd.enums.ResultCodeEnum;
importlombok.Data;/*
@ClassNameActionResult
@Description统一返回值封装
@AuthorMrDong
@Date2022/7/2614:51
/
@Data
publicclassActionResult{
privateIntegercode;
privateStringmsg;
privateIntegercount;
privateObjectdata;
publicstaticActionResultdefaultOk(Integercode,Stringmsg,Integercount,Objectdata){
returnnewActionResult(code,msg,count,data);
}publicstaticActionResultdefaultOk(Integercount,Objectdata){
returnnewActionResult(ResultCodeEnum.RC200,count,data);
}publicstaticActionResultdefaultOk(Objectdata){
returnnewActionResult(ResultCodeEnum.RC200,null,data);
}publicstaticActionResultdefaultOk(){
returnnewActionResult(ResultCodeEnum.RC200);
}
publicstaticActionResultdefaultFail(){
returnnewActionResult(ResultCodeEnum.RC999);
}
publicstaticActionResultdefaultFail(Integercode,Stringmsg){
returnnewActionResult(code,msg);
}
publicstaticActionResultdefaultFail(ResultCodeEnumresultCodeEnum){
returnnewActionResult(resultCodeEnum);
}
publicActionResult(Integercode,Stringmsg,Integercount,Objectdata){
this.code=code;
this.msg=msg;
this.count=count;
this.data=data;
}
publicActionResult(Integercode,Stringmsg){
this.code=code;
this.msg=msg;
}
publicActionResult(ResultCodeEnumresultCodeEnum){
this.code=resultCodeEnum.getCode();
this.msg=resultCodeEnum.getMessage();
}
publicActionResult(ResultCodeEnumresultCodeEnum,Integercount,Objectdata){
this.code=resultCodeEnum.getCode();
this.msg=resultCodeEnum.getMessage();
this.count=count;
this.data=data;
}
}
定义状态枚举
packagecom.wxd.enums;/
@authorwxd
@versionV1.0
@descriptionResultCodeEnum
@date2022/8/1013:35
/
publicenumResultCodeEnum{
/
操作成功
/
RC200(200,"操作成功"),
/
未授权
/
RC401(401,"用户未授权"),
/
请求被禁止
/
RC403(403,"请求被禁止"),
/
服务异常
/
RC500(500,"服务器异常,请联系管理员"),
/*
操作失败
*/
RC999(999,"操作失败"),RC1001(1001,"用户名密码错误"),
RC1002(1002,"未授权的资源"),
RC1003(1003,"未授权的资源"),
RC1004(1004,"缺少请求参数异常"),
RC1005(1005,"缺少请求体参数异常"),
RC1006(1006,"参数绑定异常"),
RC1007(1007,"方法参数无效异常");privateIntegercode;
privateStringmessage;ResultCodeEnum(Integercode,Stringmessage){
this.code=code;
this.message=message;
}publicIntegergetCode(){
returncode;
}publicStringgetMessage(){
returnmessage;
}
}
统一处理返回值及异常
实现原理:需要实现SpringBoot提供的ResponseBodyAdvice这个接口,完成统一返回值的封装及异常的处理。实现了这个接口之后,在Controller返回的时候只需要将对象直接返回,有些不需要返回值的可以直接返回void。
packagecom.wxd.advice;importcom.wxd.entity.ActionResult;
importcom.wxd.enums.ResultCodeEnum;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.core.MethodParameter;
importorg.springframework.http.HttpStatus;
importorg.springframework.http.MediaType;
importorg.springframework.http.converter.HttpMessageNotReadableException;
importorg.springframework.http.server.ServerHttpRequest;
importorg.springframework.http.server.ServerHttpResponse;
importorg.springframework.validation.BindException;
importorg.springframework.web.bind.MethodArgumentNotValidException;
importorg.springframework.web.bind.MissingServletRequestParameterException;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseStatus;
importorg.springframework.web.bind.annotation.RestControllerAdvice;
importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*
@version:V1.0
@author:wxd
@description:全局异常处理以及返回值的统一封装
@Date2022/7/2616:24
/
@RestControllerAdvice(value="com.wxd.controller")
@Slf4j
publicclassResponseAdviceimplementsResponseBodyAdvice{@Override
publicbooleansupports(MethodParametermethodParameter,ClassaClass){
returntrue;
}/
统一包装
@paramo
@parammethodParameter
@parammediaType
@paramaClass
@paramserverHttpRequest
@paramserverHttpResponse
@return
/
@Override
publicObjectbeforeBodyWrite(Objecto,MethodParametermethodParameter,MediaTypemediaType,ClassaClass,ServerHttpRequestserverHttpRequest,ServerHttpResponseserverHttpResponse){
/
String、ActionResult不需要再包一层(不想包一层ActionResult对象的可以在这里把这个对象过滤掉)
/
if(oinstanceofString||oinstanceofActionResult){
returno;
}
returnActionResult.defaultOk(o);
}/
系统内部异常捕获
@parame
@return
*/
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(value=Exception.class)
publicObjectexceptionHandler(Exceptione){
log.error("系统内部异常,异常信息",e);
returnActionResult.defaultFail(ResultCodeEnum.RC500);
}
/*
忽略参数异常处理器;触发例子:带有@RequestParam注解的参数未给参数
@parame忽略参数异常
@returnResponseResult
/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MissingServletRequestParameterException.class)
publicObjectparameterMissingExceptionHandler(MissingServletRequestParameterExceptione){
log.error("缺少Servlet请求参数异常",e);
returnActionResult.defaultFail(ResultCodeEnum.RC1004);
}
/
缺少请求体异常处理器;触发例子:不给请求体参数
@parame缺少请求体异常
@returnResponseResult
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
publicObjectparameterBodyMissingExceptionHandler(HttpMessageNotReadableExceptione){
log.error("参数请求体异常",e);
returnActionResult.defaultFail(ResultCodeEnum.RC1005);
}/*
统一处理请求参数绑定错误(实体对象传参);
@parameBindException
@returnResponseResult
/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(BindException.class)
publicObjectvalidExceptionHandler(BindExceptione){
log.error("方法参数绑定错误(实体对象传参)",e);
returnActionResult.defaultFail(ResultCodeEnum.RC1006);
}
/*
统一处理请求参数绑定错误(实体对象请求体传参);
@parame参数验证异常
@returnResponseResult
/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({MethodArgumentNotValidException.class})
publicObjectparameterExceptionHandler(MethodArgumentNotValidExceptione){
log.error("方法参数无效异常(实体对象请求体传参)",e);
returnActionResult.defaultFail(ResultCodeEnum.RC1007);
}
}
void 无返回值
有返回值
如何处理SpringBoot统一返回格式的详细内容,希望对您有所帮助,信息来源于网络。