Saya percaya bahawa kebanyakan pembangun bahagian belakang perlu antara muka dengan bahagian hadapan dalam pembangunan harian Sudah tentu, jika anda melakukan bahagian hadapan dan bahagian belakang sendiri, anda boleh bermain walau bagaimanapun anda mahu, tetapi kami masih perlu Mencapai penyeragaman tertentu. Dalam projek dengan pemisahan bahagian hadapan dan belakang, format yang dikembalikan oleh bahagian belakang mestilah mesra dan tetap, dan tidak boleh ditukar dengan kerap, jika tidak, ia akan membawa banyak beban kerja kepada pembangun bahagian hadapan.
@PostMapping("/test") public String test(){ return "Hello World"; }
hasil panggilan posmen:
@PostMapping("/getUser") public ActionResult getUser(){ User user = new User(); user.setId(UUID.randomUUID().toString()); user.setName("MrDong"); user.setAge(20); return ActionResult.defaultOk(user); }
Hasil panggilan posmen:
@PostMapping("/error") public ActionResult error(){ return ActionResult.defaultFail(1000,"服务器异常,请联系管理员"); }
hasil panggilan posmen:
Saya mentakrifkan dua objek ActionResult untuk merangkum nilai pulangan, yang boleh diubah suai mengikut situasi sebenar syarikat anda:
package com.wxd.entity; import com.wxd.enums.ResultCodeEnum; import lombok.Data; /** * @ClassName ActionResult * @Description 统一返回值封装 * @Author Mr Dong * @Date 2022/7/26 14:51 */ @Data public 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; } }
Prinsip pelaksanaan: Anda perlu melaksanakan Antara muka ResponseBodyAdvice disediakan oleh SpringBoot , lengkapkan enkapsulasi nilai pulangan bersatu dan pengendalian pengecualian. Selepas melaksanakan antara muka ini, anda hanya perlu mengembalikan objek secara langsung apabila Pengawal kembali.
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") @Slf4j public 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); } }
Atas ialah kandungan terperinci Cara mengendalikan format pulangan bersatu SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!