springboot统一接口返回数据的实现
一,没有异常的情况,正常返回数据
希望接口统一返回的数据格式如下:
{ "status":0, "msg":"成功", "data":null }
和接口数据对应的bean
/** *统一返回结果的实体 *@param*/ publicclassResult implementsSerializable{ privatestaticfinallongserialVersionUID=1L; /** *错误码 */ privateintstatus; /** *提示消息 */ privateStringmsg; /** *返回的数据体 */ privateTdata; publicintgetStatus(){ returnstatus; } publicvoidsetStatus(intstatus){ this.status=status; } publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; } publicTgetData(){ returndata; } publicvoidsetData(Tdata){ this.data=data; } }
操作Result实体的工具类
/** *生成result的工具类,避免重复代码 */ publicclassResultUtils{ /** *成功时生成result的方法,有返回数据 */ publicstaticResult success(Tt){ Result result=newResult<>(); result.setStatus(ResultEnum.SUCCESS.getCode()); result.setMsg(ResultEnum.SUCCESS.getMsg()); result.setData(t); returnresult; } /** *成功时生成result的方法,无返回数据 */ publicstatic Result success(){ returnsuccess(null); } /** *失败时生成result的方法 */ publicstatic Result error(intstatus,Stringmsg){ Result result=newResult<>(); result.setStatus(status); result.setMsg(msg); returnresult; } }
封装错误码和错误消息的枚举类
/** *所有返回结果的枚举 */ publicenumResultEnum{ UNKNOWN_ERROR(-1,"未知错误"), SUCCESS(0,"成功"), BASIC_INFO_ID_IS_EMPTY(600,"基本信息中BasicInfoId为空"), BASIC_INFO_ADD_TO_DATABASE_FAILURE(601,"向数据库添加基本信息失败"), DETAILS_DATA_BASIC_INFO_ID_IS_EMPTY(602,"测试数据中BasicInfoId为空"), DETAILS_DATA_ADD_TO_DATABASE_FAILURE(603,"向数据库添加测试数据失败"); ResultEnum(intcode,Stringmsg){ this.code=code; this.msg=msg; } privateintcode; privateStringmsg; publicintgetCode(){ returncode; } publicvoidsetCode(intcode){ this.code=code; } publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; } @Override publicStringtoString(){ return"ResultEnum{"+ "code="+code+ ",msg='"+msg+'\''+ '}'; } }
统一封装返回结果的切面
之所以需要这个切面,是为了避免每个Controller方法中都要调用ResultUtils.success()。有了这个切面,Controller可以和原来一样正常返回对象,字符串,void,在切面里面将结果封装成Result实体,而不需要每个Controller方法都返回Result实体。
/** *统一处理返回结果的切面,避免每个controller方法里面都要调用ResultUtils.success()这句话 *统一在这个切面里面调用 */ @ControllerAdvice publicclassMyResponseAdviceimplementsResponseBodyAdvice
二,有异常的情况下
service层为了自动回滚事务,会抛出一些自定义的RuntimeException。默认情况下,只有RuntimeException才会回滚事务。如果Controller里面直接处理service层抛出的异常,则Controller里面到处都是trycatch块,代码会很难看。将异常集中在一个地方处理会好很多。
springboot中是通过@ControllerAdvice和@ExceptionHandler来完成统一异常处理的。这2个注解只能处理Controller和拦截器中抛出的异常,其他地方抛出的异常(比如Filter中抛出的异常),无法捕获。其他地方抛出的异常会转到/error的Controller方法来处理,默认是BasicErrorController来处理,为了能处理其他地方抛出的异常,我们会自定义ErrorController。
统一的异常处理类,处理Controller和拦截器抛出的异常
/** *统一的异常处理类 */ @ControllerAdvice publicclassMyExceptionHandler{ /** *转发到/error,表示由BasicErrorController处理, *BasicErrorController是由springboot自动装配到容器中的 */ /*@ExceptionHandler(BasicInfoException.class) publicStringhandleException(Exceptionex,HttpServletRequestrequest){ request.setAttribute("javax.servlet.error.status_code",401); request.setAttribute("exMsg",ex.getMessage()); return"forward:/error"; }*/ /** *处理基本信息相关的异常 */ @ExceptionHandler(BasicInfoException.class) @ResponseBody publicResulthandleBasicInfoException(BasicInfoExceptionex){ returnResultUtils.error(ex.getCode(),ex.getMessage()); } /** *处理测试数据相关的异常 */ @ExceptionHandler(DetailsDataException.class) @ResponseBody publicResulthandleDetailsDataException(DetailsDataExceptionex){ returnResultUtils.error(ex.getCode(),ex.getMessage()); } /** *处理未知异常 */ @ExceptionHandler(Exception.class) @ResponseBody publicResulthandleUnKnowException(Exceptionex){ returnResultUtils.error(ResultEnum.UNKNOWN_ERROR.getCode(),ex.getMessage()); } }
自定义的异常类示例
publicclassBasicInfoExceptionextendsRuntimeException{ privateintcode; publicBasicInfoException(intcode,Stringmsg){ super(msg); this.code=code; } publicintgetCode(){ returncode; } }
处理其他地方抛出的异常(不是Controller和拦截器抛出的异常),自定义ErrorController
/** *自定义ErrorController,处理其他地方抛出的异常(不是Controller和拦截器抛出的异常) */ @Controller publicclassMyBasicErrorControllerextendsAbstractErrorController{ privateLoggerlogger=LoggerFactory.getLogger(this.getClass()); /** *可以通过@Value获取到 */ @Value("${server.error.path}") privateStringmyPath; privatefinalErrorPropertieserrorProperties; privateErrorAttributesmErrorAttributes; publicMyBasicErrorController(ErrorAttributeserrorAttributes,ServerPropertiesserverProperties){ super(errorAttributes); this.errorProperties=serverProperties.getError(); this.mErrorAttributes=errorAttributes; } //@RequestMapping(value="/error") @RequestMapping("${server.error.path}")//从properties文件中获取 @ResponseBody publicResult
自定义ErrorController中错误处理的方法中,也可以直接将异常抛出,这样异常就会交给统一异常处理器进行处理。
//@RequestMapping(value="/error") @RequestMapping("${server.error.path}")//从properties文件中获取 @ResponseBody publicResult
到此这篇关于springboot统一接口返回数据的实现的文章就介绍到这了,更多相关springboot统一接口返回数据内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。