phpcms 网站源码,wordpress登陆页面,wordpress权限设置方法,263企业邮箱入口网页版#x1f4e2; 大家好#xff0c;我是 【战神刘玉栋】#xff0c;有10多年的研发经验#xff0c;致力于前后端技术栈的知识沉淀和传播。 #x1f497; #x1f33b; CSDN入驻不久#xff0c;希望大家多多支持#xff0c;后续会继续提升文章质量#xff0c;绝不滥竽充数… 大家好我是 【战神刘玉栋】有10多年的研发经验致力于前后端技术栈的知识沉淀和传播。 CSDN入驻不久希望大家多多支持后续会继续提升文章质量绝不滥竽充数欢迎多多交流。 文章目录 写在前面的话返回结果统一封装定义一个返回值VO类处理返回值的几种方案HandlerMethodReturnValueHandler 总结陈词 写在前面的话
本系列博文已连载到第六篇通过前五篇博文我们已完成了教师信息的基础增删改查功能在介绍其他知识专栏之前先来谈一谈CURD页面的规范问题。 前后端分离的开发模式中后端程序猿有必要与前端程序猿约定一个相对于规范的返回格式如果仅仅返回数据有点像裸奔。因此后端项目需要对返回结果进行统一封装返回前端也需要封装请求后置拦截器对返回结果处理。 按业内约定俗成的规范返回结果至少包含code 状态码、data 数据、msg 消息内容、error 错误内容。 上述只是基础部分实际开发中可能还包含timestamp 时间戳、requestId 日志ID等等。 加油程序猿保持住Tempo开干玩的就是真实
关联文章 《程序猿入职必会1 · 搭建拥有数据交互的 SpringBoot 》 《程序猿入职必会2 · 搭建具备前端展示效果的 Vue》 《程序猿入职必会3 · SpringBoot 各层功能完善 》 《程序猿入职必会4 · Vue 完成 CURD 案例 》 《程序猿入职必会5 · CURD 页面细节规范 》 返回结果统一封装
定义一个返回值VO类
这个是考虑统一封装的第一步很简单仅提供参考。
Data
public class ResultModelT {/*** 成功编码*/public static final String SUCCESS_CODE ResponseCodeEnum.SUCCESS.getCode();/*** 异常编码*/public static final String ERROR_CODE ResponseCodeEnum.EX_ERROR.getCode();/*** 响应编码*/private String code SUCCESS_CODE;/*** 响应数据*/private T data;/*** 响应信息*/private String message ;/*** 异常详细信息*/private String error ;/*** 返回成功* param data* param T* return*/public static T ResultModelT success(T data) {return success(data, );}/*** 返回成功* param data* param message* param T* return*/public static T ResultModelT success(T data, String message) {return new ResultModel(SUCCESS_CODE, data, message);}/*** 返回失败* param code* param message* param error* return*/public static ResultModel fail(String code, String message, String error) {return new ResultModel(code, null, message, error);}public static ResultModel fail(ResponseCodeEnum code) {return new ResultModel(code.getCode(), null, code.getMessage(), code.getMessage());}public static ResultModel fail(ResponseCodeEnum code, String error) {return new ResultModel(code.getCode(), null, code.getMessage(), error);}public static ResultModel fail(String error) {return new ResultModel(ResponseCodeEnum.EX_ERROR.getCode(), null, error, error);}public boolean isSuccess() {return Objects.equals(this.code, ResponseCodeEnum.SUCCESS.getCode());}public ResultModel() {}public ResultModel(String code, T data, String message) {this.code code;this.data data;this.message message;}public ResultModel(String code, T data, String message, String error) {this.code code;this.data data;this.message message;this.error error;}
}也可以定义一个状态枚举类非必须
public enum ResponseCodeEnum {/*** 调用成功*/SUCCESS(00000, 调用成功),/*** 系统异常*/EX_ERROR(EX00000, 系统异常),/*** 参数不合法*/EX_PARAM(EX00001, 参数不合法),/*** 接口调用异常*/EX_REQUEST(EX00002, 接口调用异常),/*** 接口返回错误*/EX_RESULT(EX00003, 接口返回错误),/*** 微信接口异常*/EX_WECHAT(EX00004, 微信接口异常),/*** 令牌为空*/EX_TOKEN_EMPTY(EX00005, 令牌为空),/*** 令牌无效*/EX_TOKEN_INVALID(EX00006, 令牌无效),/*** 网站来源无效*/EX_REFERER_INVALID(EX00007, 网站来源无效),/*** 404*/EX_PAGE_404(EX404, 页面地址无效);private String code;private String message;ResponseCodeEnum(String code, String message) {this.code code;this.message message;}public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getMessage() {return message;}public void setMessage(String message) {this.message message;}Overridepublic String toString() {return [ this.code ] this.message;}
}处理返回值的几种方案
SpringBoot 针对 返回值处理有多种方案相关关键词诸如 ResponseBodyAdvice、MessageConverters、 HandlerMethodReturnValueHandler。
【三者比较】 1、ResponseBodyAdvice响应拦截器 作用ResponseBodyAdvice 允许你在将响应体写入 HTTP 响应之前拦截和修改它。它提供了一种全局定制响应处理逻辑的方式适用于 Spring MVC 或 Spring WebFlux 应用程序。 工作原理ResponseBodyAdvice 接口定义了在响应体写入之前将被调用的方法你可以在这些方法中检查或修改响应体、方法返回类型、请求和其他上下文信息。这使得你可以根据应用程序的需求对响应进行定制化处理。 示例你可以使用 ResponseBodyAdvice 添加全局的响应头信息、对返回数据进行统一的格式化等。 2、MessageConverters消息转换器 作用MessageConverters 负责将 Controller 方法的返回值转换为 HTTP 响应的内容以及将请求的内容转换为 Controller 方法的参数。 工作原理消息转换器负责将 Java 对象与特定的媒体类型之间进行转换例如 JSON、XML、HTML 等。它可以根据请求的 Content-Type 头信息和方法的返回值类型选择适当的转换器来进行转换。 示例你可以使用 MappingJackson2HttpMessageConverter 将 Java 对象转换为 JSON 格式的响应体或将请求体中的 JSON 数据转换为 Java 对象。 3、HandlerMethodReturnValueHandler返回值处理器 作用HandlerMethodReturnValueHandler 用于处理方法的返回值将其转换为合适的响应内容。它负责将方法的返回值转换为 HTTP 响应体的内容。 工作原理HandlerMethodReturnValueHandler 负责将方法的返回值转换为特定的响应内容例如对象、字符串、视图等。它可以根据返回值的类型和请求的信息来选择适当的处理方式。 示例你可以使用 ViewMethodReturnValueHandler 将返回值转换为视图HttpEntityMethodProcessor 将返回的 HttpEntity 对象转换为 HTTP 响应。 总的来说ResponseBodyAdvice 允许你在响应体写入之前对其进行全局性的处理MessageConverters 负责将 Java 对象与特定的媒体类型之间进行转换而 HandlerMethodReturnValueHandler 用于根据方法的返回值类型和请求信息将其转换为合适的响应内容。 关于顺序HandlerMethodReturnValueHandler 负责处理方法的返回值ResponseBodyAdvice 在写入响应体之前提供额外的处理机会而 MessageConverters 则负责将处理过的结果转换为特定的媒体类型。因此它们的执行顺序是先执行 HandlerMethodReturnValueHandler然后是 ResponseBodyAdvice最后是 MessageConverters。
【方案点评】 三种处理方案各有千秋本文选用 HandlerMethodReturnValueHandler 展开介绍顺便可以介绍一下自定义注解的结合使用。 当然博主所在公司进行框架封装时采用 ResponseBodyAdvice并未采用 HandlerMethodReturnValueHandler原因是自定义 HandlerMethodReturnValueHandler 意味着要替换 RequestResponseBodyMethodProcessor SpringMVC 的若干默认定制功能就消失了可能导致非意料的情况具体后续再专栏介绍。 HandlerMethodReturnValueHandler
废话不多说直接上代码。
Step1、定义两个自定义注解放着备用 后续需要进行返回值封装处理的控制器就使用ResultController 注解即可。
Target({ElementType.TYPE, ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
Documented
public interface ResultModelAnnotation {
}Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
RestController
ResultModelAnnotation
public interface ResultController {
}Step2、自定义 HandlerMethodReturnValueHandler 实现 HandlerMethodReturnValueHandler 接口实现 supportsReturnType 和 handleReturnValue 方法。 supportsReturnType 代表生效时机下方意思是当类或者方法包含 ResultModelAnnotation 注解的时生效。 handleReturnValue 代表返回值处理逻辑其实就是封装成 ResultModel 格式再 response 出去。
public class ResultModelHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {Overridepublic boolean supportsReturnType(MethodParameter returnType) {return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResultModelAnnotation.class) || returnType.hasMethodAnnotation(ResultModelAnnotation.class));}Overridepublic void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {ResultModelObject resultModel;ApiOperation methodAnnotation returnType.getMethodAnnotation(ApiOperation.class);String message ;if (methodAnnotation ! null) {message methodAnnotation.value() 成功;}if (returnValue instanceof ResultModel) {resultModel (ResultModelObject) returnValue;if (!resultModel.isSuccess()) {resultModel.setMessage(message error);}} else {resultModel ResultModel.success(returnValue, message);}mavContainer.setRequestHandled(true);HttpServletResponse response webRequest.getNativeResponse(HttpServletResponse.class);// 设置状态码response.setStatus(HttpStatus.OK.value());response.setHeader(result-model, true);// 设置ContentTyperesponse.setContentType(MediaType.APPLICATION_JSON_VALUE);// 避免乱码response.setCharacterEncoding(UTF-8);PrintWriter writer null;try {writer response.getWriter();writer.write(JSON.toJSONString(resultModel, SerializerFeature.WriteMapNullValue));writer.flush();} catch (IOException ex) {ex.printStackTrace();} finally {if (writer ! null) {writer.close();}}}
}Step3、自定义RequestMappingHandlerAdapter 继承 RequestMappingHandlerAdapter重写 afterPropertiesSet 方法。 逻辑就是将前面自定义的 ResultModelHandlerMethodReturnValueHandler放到第一位首发选手。
public class ResultRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {Overridepublic void afterPropertiesSet() {super.afterPropertiesSet();ListHandlerMethodReturnValueHandler returnValueHandlers super.getReturnValueHandlers();ResultModelHandlerMethodReturnValueHandler handler new ResultModelHandlerMethodReturnValueHandler();ListHandlerMethodReturnValueHandler list new ArrayList();list.add(handler);list.addAll(returnValueHandlers);super.setReturnValueHandlers(list);}
}Step4、控制类添加自定义注解 直接用前面博文提到的教师信息控制器将 RestController 注解修改为 ResultController Tips若部分接口不需要按这个格式返回则不需要修改注解。 ResultController
Api(value ZyTeacherInfoController, tags {教师信息表服务})
RequestMapping(value /zyTeacherInfo)
public class ZyTeacherInfoController extends BaseController {}Step5、万事俱备测试一下 启动服务访问单个教师的接口http://localhost:8083/zyTeacherInfo/2 输出信息如下可以看到其格式了搞定收工
{code: 00000,data: {createdTime: 2024-05-16 20:07:21,modifiedTime: null,sortNo: null,stuItem: null,teaCode: 2,teaConfig: null,teaImg: null,teaName: 李老师,teaPhone: null,teaType: null,validFlag: 1},error: ,message: 获取教师信息表详细信息成功,success: true
}总结陈词
此篇文章介绍了前后端分离项目中关于统一返回结果的封装仅供学习参考。 下一篇文章介绍前端 Axios 插件封装思路以及对于这一返回封装结果的接受处理。 后续会逐步分享企业实际开发中的实战经验有需要交流的可以联系博主。