当前位置: 首页 > 后端技术 > Java

【晓晓峰的SpringBoot系列】【4】SpringBoot为什么返回统一结果包装

时间:2023-04-01 17:50:40 Java

锛熷湪鍓嶅悗绔垎绂荤殑鏃朵唬锛屽鏋滄病鏈夌粺涓€鐨勮繑鍥炴牸寮忥紝缁欏墠绔殑缁撴灉浜旇姳鍏棬锛屼及璁′細琚墠绔皬浼欎即楠傛銆傛垜浠兂涓鸿嚜瀹氫箟寮傚父鎶涘嚭鎸囧畾鐨勭姸鎬佺爜鏉ユ帓鏌ラ敊璇紝涓轰笉鍙鐭ョ殑绯荤粺寮傚父鎶涘嚭鍙嬪ソ鐨勫紓甯镐俊鎭€傛垜浠笇鏈涙帴鍙g粺涓€杩斿洖涓€浜涢澶栫殑鏁版嵁锛屾瘮濡傛帴鍙g殑鎵ц鏃堕棿绛夌瓑銆?..鎵€浠ワ紝鏃犺鏄棩甯稿鎺ュ墠绔皬浼欎即锛岃繕鏄鎺ュ叾浠栭儴闂ㄧ殑鎺ュ彛锛岄兘搴旇杩斿洖涓€涓浐瀹氱殑鏍煎紡銆傛湰鏂囩粰鍑轰簡涓€绉嶇畝鍗曢€氱敤鐨勮繑鍥炴牸寮忋€傚鏋滄偍鏈夐渶姹傦紝鍙互鍦ㄨ鐗堟湰鐨勫熀纭€涓婏紝鏍规嵁鎮ㄧ殑涓氬姟闇€姹備赴瀵岃繑鍥炴牸寮忋€傝繑鍥炴暟鎹牸寮忓涓嬸煈囥€傛劅鍏磋叮鐨勬湅鍙嬪彲浠ョ户缁湅鐪婼pringBoot鏄浣曞疄鐜扮殑銆倇"status":true,"code":"0000","msg":"","data":{"id":1,"deptId":103,"userName":"admin","nickName":"灏忔檽宄?,"userType":"00","email":"xxf@163.com","phone":"15888888888","status":"0","remark":"Administrator"}}鎬庝箞鍋氾紵馃棣栧厛鍒涘缓涓€涓祴璇旵ontroller锛屼唬鐮佸涓嬸煈噋ackagecom.maple.demo.controller;importcom.maple.demo.util.ResultJson;importlombok.Data;importlombok.RequiredArgsConstructor;importorg.springframework.web銆傜粦瀹氥€俛nnotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***@authorXiaoXiaofeng*@date2022/07/15*/@RestController@RequiredArgsConstructor@RequestMapping("/example")鍏叡绫籘estResultController{@GetMapping("/testResult")publicTesttestResult(){Testtest=newTest();test.setName("灏忓皬椋?);娴嬭瘯.setAge(18);test.setRemark("澶у濂斤紝鎴戞槸灏忔灚锛屽枩娆㈡垜灏辩偣涓禐鍚?);杩斿洖娴嬭瘯锛泒@GetMapping("/testResultJson")publicResultJsontestResultJson(){娴嬭瘯娴嬭瘯=newTest();test.setName("娼囨絿鏋?);娴嬭瘯.setAge(18);test.setRemark("澶у濂斤紝鎴戞槸灏忔灚锛屽枩娆㈡垜灏辩粰鎴戠偣涓禐鍚?);杩斿洖鏂扮殑ResultJson锛堟祴璇曪級锛泒@DatastaticclassTest{绉佹湁瀛楃涓插悕绉帮紱绉佷汉鏁存暟骞撮緞锛涚浜哄瓧绗︿覆澶囨敞锛泒}鐪嬬湅璋冪敤杩斿洖鐨勭粨鏋滄槸杩欐牱馃憖{"name":"灏忓皬鏋?,"age":18,"remark":"澶у濂斤紝鎴戝湪绗戝皬鏋紝鍠滄鎴戠殑灏忎紮浼寸粰athumbup"}鐒跺悗鍦╱til鍖呬笅瀹氫箟涓€涓粺涓€鐨勮繑鍥炴牸寮忕被锛屼唬鐮佸涓嬸煈噋ackagecom.maple.demo.util;importlombok.Data;/***缁熶竴杩斿洖淇℃伅鍖呰绫?*@author钀ф檽宄?@date2022/07/15*/@DatapublicclassResultJson{privatestaticfinalSt鍝嶉搩SUCCESS_CODE="0000";/***鎴愬姛鎴栧け璐ョ殑鐘舵€佸€硷紝true锛氭垚鍔燂紱false锛氬け璐?杩欓噷杩斿洖鐮佷负锛氣€?000鈥濓紝绯荤粺璁や负鎺ュ彛鎴愬姛锛涘叾浠栧€间唬琛ㄥけ璐?/privateBooleanstatus;/***姝g‘鐨勭姸鎬佺爜鏄?000*/privateStringcode;/***杩斿洖鎻愮ず淇℃伅*/privateStringmsg;/***杩斿洖鏁版嵁*/privateObjectdata;publicResultJson(){this.status=true;this.code=SUCCESS_CODE;this.msg="";}publicResultJson(Objectdata){this.status=true;this.code=SUCCESS_CODE;this.msg="";杩欎釜銆傛暟鎹?鏁版嵁锛泒publicResultJson(Stringcode,Stringmsg){this.status=SUCCESS_CODE.equals(code);杩欎釜銆備唬鐮?浠g爜锛泃his.msg=鍛崇簿锛泒/***濡傛灉杩斿洖鐨勭姸鎬佺爜涓嶄负0000锛屾帴鍙g姸鎬佹垚鍔燂紝璇风敤杩欎釜*@paramstatus鎺ュ彛璇锋眰鐘舵€?@paramcode杩斿洖鐮佸€?@parammsg杩斿洖淇℃伅*@paramdata杩斿洖鏁版嵁*/publicResultJson(Booleanstatus,Stringcode,Stringmsg,Objectdata){this.status=鐘舵€侊紱杩欎釜銆備唬鐮?浠g爜锛泃his.msg=鍛崇簿锛涜繖涓€傛暟鎹?鏁版嵁锛泒}鏅€氱増锛屼唬鐮佷镜鍏ユ€ц緝澶э紝鎵€浠ユ垜浠彲浠ュ湪ResultJson涓繑鍥炵粨鏋滐紝浠g爜濡備笅馃憞packagecom.maple.demo.controller;importcom.maple.demo.util.ResultJson;importlombok.Data锛涘鍏ombok.RequiredArgsConstructor锛涘鍏rg.springframework.web.bind.annotation.GetMapping锛涘鍏rg.springframework.web.bind銆俛nnotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***@authorXiaoXiaofeng*@date2022/07/15*/@RestController@RequiredArgsConstructor@RequestMapping("/example")鍏叡绫籘estResultController{@GetMapping("/testResult")publicTesttestResult(){Testtest=newTest();test.setName("灏忓皬椋?);娴嬭瘯.setAge(18);test.setRemark("澶у濂斤紝鎴戞槸灏忔灚锛屽枩娆㈡垜灏辩粰鎴戠偣涓禐鍚?);杩斿洖娴嬭瘯锛泒/***鏅€氳繑鍥?/@GetMapping("/testResultJson")publicResultJsontestResultJson(){娴嬭瘯娴嬭瘯=鏂版祴璇?);test.setName("灏忓皬椋?);娴嬭瘯.setAge(18);test.setRemark("澶у濂斤紝鎴戞槸灏忓皬椋庯紝鍠滄鎴戠殑鏈嬪弸A鍠滄");杩斿洖鏂扮殑ResultJson锛堟祴璇曪級锛泒@DatastaticclassTest{绉佹湁瀛楃涓插悕绉帮紱绉佷汉鏁存暟骞撮緞锛涚浜哄瓧绗︿覆澶囨敞锛泒}鏉ョ湅鐪嬭繑鍥炵粨鏋滒煈噞"status":true,"code":"0000","msg":"","data":{"name":"灏忓皬宄?,"age":18,"remark":"澶у濂斤紝鎴戞槸灏忓皬椋庯紝鍠滄鎴戠殑鏈嬪弸浠粰鎴戠偣涓禐"}}鍒嗘澶勭悊锛屾棤浠g爜渚靛叆涓婇潰鐨勪唬鐮佽櫧鐒跺疄鐜颁簡鍔熻兘锛屼絾鏄繑鍥炵殑缁撴灉涓€瀹氭槸processed锛屽浠g爜鐨勪镜鍏ユ€ф瘮杈冨己銆係pring鏈夊悇鏂归潰鐨勬敮鎸侊紝璁╂垜浠湅鐪嬩唬鐮佹槸濡備綍鏃犱镜鍏ョ殑瀹炵幇杩欎釜鍔熻兘鐨勬渶鍚庡垱寤轰竴涓厤缃被锛屾坊鍔燖RestControllerAdvice娉ㄨВ锛屼唬鐮佸涓嬸煈噋ackagecom.maple.demo.config;importcom.alibaba.fastjson.JSON;importcom.maple.demo.util.ResultJson;importlombok.extern.slf4j銆係lf4j锛涘鍏rg.jetbrains.annotations.NotNull锛涘鍏rg.springframework.core.MethodParameter锛涘鍏rg.springframework.http.MediaType锛涘鍏rg.springframework.http.converter.HttpMessageConverter锛涘鍏rg.springframework.http.server.ServerHttpRequest;importorg.springframework.http.server.ServerHttpResponse;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/***缁熶竴杩斿洖缁撴灉澶勭悊锛屽寘鎷繑鍥炵粨鏋滄牸寮忕殑缁熶竴灏佽锛屼互鍙婅繑鍥炲紓甯哥殑缁熶竴澶勭悊**@author绗戝皬閿?@date2022/07/15*/@Slf4j@RestControllerAdvicepublicclassRestResponseAdviceimplementsResponseBodyAdvice{@Overridepublicbooleansupports(@Overridepublicbooleansupports(@Overridepublicbooleansupports(@Slf4j@RestControllerAdvicepublicclassRestResponseAdviceimplementsResponseBodyAdviceNotNullMethodParameterreturnType,@NotNullClass>converterType){returntrue;}/***杩斿洖缁撴灉浠ョ粺涓€鐨勮繑鍥炴牸寮忓寘瑁?*@return鍖呰鍚庣殑杩斿洖缁撴灉*/@OverridepublicObjectbeforeBodyWrite(Objectbody,@NotNullMethodParameterreturnType,@NotNullMediaTypeselectedContentType,@NotNullClass>selectedConverterType,@NotNullServerHttpRequestrequest,ServerHttpResponseresponse){//鎸囧畾杩斿洖缁撴灉涓篴pplication/json鏍煎紡//濡傛灉涓嶆寚瀹氬垯杩斿洖鐨凜ontent-Type涓簍ext/plain;charset=UTF-8response.getHeaders().setContentType(MediaType.APPLICATION_JSON);ResultJsonresult=newResultJson(body);//濡傛灉杩斿洖绫诲瀷鏄疪esultJson锛屽垯涓嶄細淇敼if(body==null){if(returnType.getParameterType().isAssignableFrom(String.class)){r杩斿洖JSON.toJSONString(缁撴灉);}}elseif(bodyinstanceofResultJson){returnbody;}elseif(bodyinstanceofString){returnJSON.toJSONString(result);}杩斿洖缁撴灉锛泒}杩欐牱灏卞畬鎴愪簡缁熶竴缁撴灉Return鉁屼笅闈㈣姹傛枃绔犲紑澶村啓鐨勬祴璇曟柟娉昲ttp://127.0.0.1:6666/testResult鐪嬬湅杩斿洖缁撴灉馃憖{"status":true,"code":"0000","msg":"","data":{"name":"灏忓皬宄?,"age":18,"remark":"澶у濂斤紝鎴戞槸灏忓皬宄帮紝鍠滄鎴戝氨鐐逛釜璧炲惂"}}杩欐牱灏卞畬鎴愪簡缁熶竴鐨勮繑鍥炴牸寮忥紝娌℃湁渚靛叆浠g爜锛屽師鏉ョ殑浠g爜搴旇鎬庝箞鍐欒繕鏄€庝箞鍐欙紝鏄笉鏄緢濂界湅@RestControllerAdvice浠嬬粛馃槾鍏堜簡瑙d竴涓婼pringBoot鐨凘RestControllerAdvice娉ㄨВ锛屽氨鏄疭pringFramework3.2涓殑涓€涓柊娉ㄨВ鐐瑰嚮杩涘叆杩欎釜娉ㄨВ鐨勬簮鐮侊紝鍙互鐪嬪埌瀹冩槸鐢盄ControllerAdvice鍜孈ResponseBody缁勫悎娉ㄨВ鐨勩€傚畠閫氬父鐢ㄤ簬瀹氫箟閫傜敤浜庢墍鏈堾RequestMapping鏂规硶鐨凘ExceptionHandler銆丂InitBinder鍜孈ModelAttribute銆傝鐧戒簡锛岃繖鏄竴涓寮篊ontroller鐨勬敞瑙c€備富瑕佸疄鐜颁簡浠ヤ笅涓変釜鏂归潰锛氬叏灞€寮傚父澶勭悊锛屽叏灞€鏁版嵁棰勫鐞嗭紝鍏ㄥ眬鏁版嵁缁戝畾锛屾垜浠潵鐪嬬湅@RestControllerAdvice娉ㄨВ@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@鐨勬簮鐮丆ontrollerAdvice@ResponseBodypublic@interfaceRestControllerAdvice{@AliasFor(annotation=ControllerAdvice.class)String[]value()default{};@AliasFor(annotation=ControllerAdvice.class)String[]basePackages()default{};@AliasFor(annotation=ControllerAdvice.class)Class[]basePackageClasses()default{};@AliasFor(annotation=ControllerAdvice.class)Class[]assignableTypes()default{};@AliasFor(annotation=ControllerAdvice.class)绫??extendsAnnotation>[]annotations()default{};}浣跨敤@RestControllerAdvice鏉ュ疄鐜扮粡甯稿仛鐨勪袱涓姛鑳姐€備互缁熶竴鏍煎紡杩斿洖缁撴灉銆傚紓甯哥粺涓€澶勭悊馃憞馃憞涓轰粈涔堣繑鍥炵粺涓€鐨勭粨鏋滀俊鎭墜鍔ㄥ皝瑁呯粺涓€鐨勮繑鍥炰俊鎭娇鐢ˊRestControllerAdvice鑷姩灏佽杩斿洖淇℃伅绠€浠婡RestControllerAdvice娉ㄨВ鏈枃婧愮爜锛歨ttps://github.com/hack-feng/maple-demo