如何处理SpringBoot统一返回格式(springboot,开发技术)

时间:2024-05-05 18:49:24 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

希望大家仔细阅读,能够学有所成!

背景

相信大部分后端开发人员在日常开发中都需要和前端对接,当然前后端都是你自己一个人搞的话可以想怎么玩就怎么玩,但是我们还是要做到一定的规范性。在前后端分离的项目中后端返回的格式一定要友好,并且固定,不能经常变来变去,不然会对前端的开发人员带来很多的工作量。

SpringBoot Controller 常见的返回格式

String

@PostMapping("/test")
publicStringtest(){
return"HelloWorld";
}

postman调用结果:

如何处理SpringBoot统一返回格式

自定义对象

正常返回

@PostMapping("/getUser")
publicActionResultgetUser(){
Useruser=newUser();
user.setId(UUID.randomUUID().toString());
user.setName("MrDong");
user.setAge(20);
returnActionResult.defaultOk(user);
}

postman调用结果:

如何处理SpringBoot统一返回格式

错误返回

@PostMapping("/error")
publicActionResulterror(){
returnActionResult.defaultFail(1000,"服务器异常,请联系管理员");
}

postman调用结果:

如何处理SpringBoot统一返回格式

定义返回对象

我定义两个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统一返回格式

有返回值

如何处理SpringBoot统一返回格式

本文:如何处理SpringBoot统一返回格式的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:uwsgi如何启动django项目下一篇:

13 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18