springboot controller 常见的返回格式string@postmapping("/test")public string test(){ return "hello world";}
postman调用结果:
自定义对象正常返回 @postmapping("/getuser") public actionresult getuser(){ user user = new user(); user.setid(uuid.randomuuid().tostring()); user.setname("mrdong"); user.setage(20); return actionresult.defaultok(user); }
postman调用结果:
错误返回 @postmapping("/error") public actionresult error(){ return actionresult.defaultfail(1000,"服务器异常,请联系管理员"); }
postman调用结果:
定义返回对象我定义两个actionresult这个对象来对返回值进行封装,可以根据自己公司实际情况修改:
package com.wxd.entity;import com.wxd.enums.resultcodeenum;import lombok.data;/** * @classname actionresult * @description 统一返回值封装 * @author mr dong * @date 2022/7/26 14:51 */@datapublic class actionresult { private integer code; private string msg; private integer count; private object data; public static actionresult defaultok(integer code, string msg, integer count, object data) { return new actionresult(code, msg, count, data); } public static actionresult defaultok(integer count, object data) { return new actionresult(resultcodeenum.rc200, count, data); } public static actionresult defaultok(object data) { return new actionresult(resultcodeenum.rc200, null, data); } public static actionresult defaultok() { return new actionresult(resultcodeenum.rc200); } public static actionresult defaultfail() { return new actionresult(resultcodeenum.rc999); } public static actionresult defaultfail(integer code, string msg) { return new actionresult(code, msg); } public static actionresult defaultfail(resultcodeenum resultcodeenum) { return new actionresult(resultcodeenum); } public actionresult(integer code, string msg, integer count, object data) { this.code = code; this.msg = msg; this.count = count; this.data = data; } public actionresult(integer code, string msg) { this.code = code; this.msg = msg; } public actionresult(resultcodeenum resultcodeenum) { this.code = resultcodeenum.getcode(); this.msg = resultcodeenum.getmessage(); } public actionresult(resultcodeenum resultcodeenum, integer count, object data) { this.code = resultcodeenum.getcode(); this.msg = resultcodeenum.getmessage(); this.count = count; this.data = data; }}
定义状态枚举package com.wxd.enums;/** * @author wxd * @version v1.0 * @description resultcodeenum * @date 2022/8/10 13:35 **/public enum resultcodeenum { /** * 操作成功 */ rc200(200, "操作成功"), /** * 未授权 */ rc401(401, "用户未授权"), /** * 请求被禁止 */ rc403(403, "请求被禁止"), /** * 服务异常 */ rc500(500, "服务器异常,请联系管理员"), /** * 操作失败 */ rc999(999, "操作失败"), rc1001(1001, "用户名密码错误"), rc1002(1002, "未授权的资源"), rc1003(1003, "未授权的资源"), rc1004(1004, "缺少请求参数异常"), rc1005(1005, "缺少请求体参数异常"), rc1006(1006, "参数绑定异常"), rc1007(1007, "方法参数无效异常"); private integer code; private string message; resultcodeenum(integer code, string message) { this.code = code; this.message = message; } public integer getcode() { return code; } public string getmessage() { return message; }}
统一处理返回值及异常实现原理:需要实现springboot提供的responsebodyadvice这个接口,完成统一返回值的封装及异常的处理。实现了这个接口之后,在controller返回的时候只需要将对象直接返回,有些不需要返回值的可以直接返回void。
package com.wxd.advice;import com.wxd.entity.actionresult;import com.wxd.enums.resultcodeenum;import lombok.extern.slf4j.slf4j;import org.springframework.core.methodparameter;import org.springframework.http.httpstatus;import org.springframework.http.mediatype;import org.springframework.http.converter.httpmessagenotreadableexception;import org.springframework.http.server.serverhttprequest;import org.springframework.http.server.serverhttpresponse;import org.springframework.validation.bindexception;import org.springframework.web.bind.methodargumentnotvalidexception;import org.springframework.web.bind.missingservletrequestparameterexception;import org.springframework.web.bind.annotation.exceptionhandler;import org.springframework.web.bind.annotation.responsestatus;import org.springframework.web.bind.annotation.restcontrolleradvice;import org.springframework.web.servlet.mvc.method.annotation.responsebodyadvice;/** * @version: v1.0 * @author: wxd * @description: 全局异常处理以及返回值的统一封装 * @date 2022/7/26 16:24 */@restcontrolleradvice(value = "com.wxd.controller")@slf4jpublic class responseadvice implements responsebodyadvice { @override public boolean supports(methodparameter methodparameter, class aclass) { return true; } /** * 统一包装 * * @param o * @param methodparameter * @param mediatype * @param aclass * @param serverhttprequest * @param serverhttpresponse * @return */ @override public object beforebodywrite(object o, methodparameter methodparameter, mediatype mediatype, class aclass, serverhttprequest serverhttprequest, serverhttpresponse serverhttpresponse) { /** * string、actionresult不需要再包一层(不想包一层actionresult对象的可以在这里把这个对象过滤掉) */ if (o instanceof string || o instanceof actionresult) { return o; } return actionresult.defaultok(o); } /** * 系统内部异常捕获 * * @param e * @return */ @responsestatus(httpstatus.internal_server_error) @exceptionhandler(value = exception.class) public object exceptionhandler(exception e) { log.error("系统内部异常,异常信息", e); return actionresult.defaultfail(resultcodeenum.rc500); } /** * 忽略参数异常处理器;触发例子:带有@requestparam注解的参数未给参数 * * @param e 忽略参数异常 * @return responseresult */ @responsestatus(httpstatus.bad_request) @exceptionhandler(missingservletrequestparameterexception.class) public object parametermissingexceptionhandler(missingservletrequestparameterexception e) { log.error("缺少servlet请求参数异常", e); return actionresult.defaultfail(resultcodeenum.rc1004); } /** * 缺少请求体异常处理器;触发例子:不给请求体参数 * * @param e 缺少请求体异常 * @return responseresult */ @responsestatus(httpstatus.bad_request) @exceptionhandler(httpmessagenotreadableexception.class) public object parameterbodymissingexceptionhandler(httpmessagenotreadableexception e) { log.error("参数请求体异常", e); return actionresult.defaultfail(resultcodeenum.rc1005); } /** * 统一处理请求参数绑定错误(实体对象传参); * * @param e bindexception * @return responseresult */ @responsestatus(httpstatus.bad_request) @exceptionhandler(bindexception.class) public object validexceptionhandler(bindexception e) { log.error("方法参数绑定错误(实体对象传参)", e); return actionresult.defaultfail(resultcodeenum.rc1006); } /** * 统一处理请求参数绑定错误(实体对象请求体传参); * * @param e 参数验证异常 * @return responseresult */ @responsestatus(httpstatus.bad_request) @exceptionhandler({methodargumentnotvalidexception.class}) public object parameterexceptionhandler(methodargumentnotvalidexception e) { log.error("方法参数无效异常(实体对象请求体传参)", e); return actionresult.defaultfail(resultcodeenum.rc1007); }}
void 无返回值
有返回值
以上就是如何处理springboot统一返回格式的详细内容。