各位小伙伴,晚上好!这里分享下后端定义前端需传入的参数:*Command的技巧之1:使用Map<>传参和返回给前端的DTO技巧之1:自定义反序列化。

目录


一、Command定义技巧(前端需传入的参数封装)
二、自定义反序列化
三、总结


一、Command定义技巧(前端需传入的参数封装)

在大专家,后端把前端需要传入的参数多封装成Command,返回给前端的封装成DTO。
Command多用动词表示。

比如:用户更新个人信息的时候,方法如下:

public void updateUserInfo(UpdateUserInfoCommand cmd){cmd.setUserId(getCurrentUserId());cmd.setOperatorId(getCurrentUserId);userInfoService.update(cmd)
}

Command命名要规范:明确是什么Command,这里是:UpdateUserInfoCommand,可能还有其他Command,不要笼统的命名为:
UserCommand.

和前端交互有传参有2种方式:

方式1:
一个Command,利用Map<String,Object>
场景:用户修改个人信息,包含各种各样的信息,各种数据格式:

"gender": "MALE",——枚举
"religiousFaith": "NOTHING", "BUDDHISM" ——字符串
"knownAllergyResource": ["鸡蛋"]——数组或容器

这么多的属性,一一封装嘛?那属性指定下来估计上百个。
用Map<>
来看一下UpdateUserInfoCommand

public class UpdateUserInfoCommand extends HashMap<String, Object> implements Serializable {private static final long serialVersionUID = 1L;private String userId;private String operatorId;private UpdateOptions options;public String getUserId() {return StringUtils.isNotEmpty(this.userId)?this.userId:(String) get("userId");}public void setUserId(String userId) {this.userId = userId;}public String getOperatorId() {return operatorId;}public void setOperatorId(String operatorId) {this.operatorId = operatorId;}public UpdateOptions getOptions() {return options;}public void setOptions(UpdateOptions options) {this.options = options;}}

用Map<String,Object>传参:
优点:灵活,适合各种参数;一个接口可以搞定
缺点:前端不知道怎么传,传什么不明确,需要口头约定

方式2:
指定具体的参数,就是一个类,各种数据类型的指定即可。

方式1还存在一个问题,那就是查询返回给前端,数据怎么交互?
先来看一下返回给前端的DTO:

@JsonSerialize(using = UserDataJsonSerializer.class)
public class UserDataDTO implements Serializable {private static final long serialVersionUID = 1L;private String userId;private Map<String, Object> fields;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public Map<String, Object> getFields() {return fields;}public void setFields(Map<String, Object> fields) {this.fields = fields;}public String getFieldAsString(String fieldName) {if (fields != null) {Object field = fields.get(fieldName);if (field != null) {return String.valueOf(field);}}return null;}}

会有什么问题?这个fields会明晃晃的作为一个key传给前端,语义一点也不明确。如下:

{"code": null,"message": null,"data": {"userId": "5c333cd684ae2c88b09b69a2","fields": {"liveAddress": {"liveProvinceCode": 220000,"liveCityCode": 220100,"liveDistrictCode": 0,"liveStreetCode": null,"liveCommitteeCode": null}},"headImg": null}
}

我们要达到的效果如下:

{"code": null,"message": null,"data": {"userId": "5c333cd684ae2c88b09b69a2","liveAddress": {"id": 897,"userId": "5bde896be4b0213186390386","detailAddress": "上海****222","provinceCode": 310000,"cityCode": 310100,"districtCode": 310117,"streetCode": 310117105,"streetName": "新桥镇","committeeCode": 310117105002,"committeeName": "新育居委会",},"headImg": null}
}

看看这个fields,使我们想要传给前端的嘛?当然不是。我们只想给前端一个key为liveAddress,value为一个对象,该对象包含了:
liveProvinceCode等信息。怎么办?

反序列化的时候处理,不用默认的反序列化,用工具jackon。

二、自定义反序列化

import com.fasterxml.jackson.databind.annotation.JsonSerialize;@JsonSerialize(using = UserDataJsonSerializer.class)
public class UserDataDTO implements Serializable {}

该注解就重写了反序列化的过程,会把fields重新处理。

public class UserDataJsonSerializer extends JsonSerializer<UserDataDTO> {@Overridepublic void serialize(UserDataDTO value, JsonGenerator gen, SerializerProvider serializers)throws IOException, JsonProcessingException {gen.writeStartObject();gen.writeStringField("userId", value.getUserId());Map<String, Object> fields = value.getFields();if (fields != null) {for (Entry<String, Object> entry : fields.entrySet()) {gen.writeFieldName(entry.getKey());gen.writeObject(entry.getValue());}}gen.writeEndObject();}}

使用jackson步骤总结如下:


1、定义一个类,继承JsonSerializer
2、重写serialize()方法
3、在返回给前端的DTO上增加注解:@JsonSerialize(using = UserDataJsonSerializer.class)


为什么就避免了fields传给前端呢?因为用默认的Serializable,所有属性都会直接返回,自己重写serialize方法,就可以按照想要的来反序列化拉。

总结:


1、Command命名语义明确:eg:UpdateUserInfoCommand

2、Command里参数尽量少用Map<String,Object>.优点:简化传参、简化接口数量;缺点:传递给前端的参数语义非常模糊(需约定好)、反序列化需要干预,否则出现冗余字段类似fields

3、jackson的运用


数据流系列-2-前后端数据传输技巧2相关推荐

  1. Django 前后端数据传输、ajax、分页器

    返回ORM目录 Django ORM 内容目录: 一.MTV与MVC模式 二.多对多表三种创建方式 三.前后端传输数据 四.Ajax ​ 五.批量插入数据 六.自定义分页器 一.MTV与MVC模式 M ...

  2. 前后端分离 -- 深入浅出 Spring Boot + Vue + ElementUI 实现相册管理系统【文件上传 分页 】 文件上传也不过如此~

    前后端分离 – 深入浅出系列 Spring Boot + Vue + ElementUI 实现相册管理系统[文件上传 分页 ] 文件上传也不过如此~ 引言 Hello,我是Bug终结者,一名热爱后端J ...

  3. 手把手搭建前后端开发框架

    快速搭建前后端开发框架 初入江湖,请多多指教 首先聊一聊,在前后端开发过程中小白会遇到哪些坑?在前后端开发过程中,前端主要是网页设计和数据渲染,前端永远是痛,主要痛在哪呢? 痛在包管理, 开发过前端的 ...

  4. 学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密

    学习加密(四)spring boot 使用RSA+AES混合加密,前后端传递参数加解密 技术标签: RSA  AES  RSA AES  混合加密  整合 前言:    为了提高安全性采用了RSA,但 ...

  5. ABP开发框架前后端开发系列——框架的总体介绍

    ABP开发框架前后端开发系列--框架的总体介绍 ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架. ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领 ...

  6. 深入解析当下大热的前后端分离组件django-rest_framework系列一

    Nodejs的逐渐成熟和日趋稳定,使得越来越多的公司开始尝试使用Nodejs来练一下手,尝一尝鲜.在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部 ...

  7. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

  8. WEB前后端交互原型通用元件库、常用组件、信息输出、信息输入、信息反馈、综合系列、页面交互、首页、分类页、内容详情、用户中心、注册登录、找回密码、元件库、web元件库、rplib、axure

    WEB前后端交互原型通用元件库.常用组件.信息输出.信息输入.信息反馈.综合系列.页面交互.首页.分类页.内容详情.用户中心.注册登录.找回密码.元件库.web元件库.rplib.axure原型 we ...

  9. 企业管理系统前后端分离架构设计 系列一 权限模型篇

    ACL(Access Control List)(访问控制列表) DAC(Discretionary Access Control)(自主访问控制) MAC(Mandatory Access Cont ...

  10. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

    在前面随笔介绍的<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>里面,介绍了如何改进和完善审计日志和登录日志的应用服务端和Winform客户端,由于篇幅限制,没有进 ...

最新文章

  1. 哔哩哔哩小甲鱼 汇编语言 记录一下 寄存器(内存访问)两个小实验
  2. python 第一课
  3. ABAP RANGE 实现 SELECTION-OPTION 功能
  4. python入门学习课程推荐
  5. RelativeLayout和LinearLayout性能比较
  6. IAR需要注意的地方
  7. asp.net中让GridView加上垂直流动条并让标头不动
  8. 【 .NET Core 3.0 】框架之二 || 后端项目搭建
  9. python第二篇:windows 下virtualenvwrapper虚拟环境搭建
  10. 拓端tecdat|R语言中进行Spearman等级相关分析
  11. C语言 扫雷游戏(代码+注释)
  12. 做微商不推广,也能赚钱?
  13. 2022年长沙市成人高考疫情防控政策
  14. 头晕和眩晕是怎样的感觉?3件小事来缓解!
  15. jsoup爬取豆瓣电影top250
  16. 4412运行java_Tiny4412 Android 启动流程
  17. 考研英语十附双语阅读:按点下班惹非议?一点小花招让你看起来超努力(纯阅读,有些方法不普适)
  18. python第二周day3
  19. f(t)=tu(t)matlab,设f(t)=ε(t)-ε(t-1),f1(t)=f(t)cos(10πt),试用MATLAB...
  20. 毕设论文评审意见分类

热门文章

  1. vue的h函数_vue 中的h函数
  2. DMAC计算机组成原理,计算机组成原理
  3. 安卓排除美颜相机等第三方相机直接调用系统相机处理方法
  4. 刚入职的新人如何快速了解公司业务--转载
  5. Hifn容量优化卡成功支持Bull公司备份方案
  6. 2022-2028全球及中国双输入RTD温度计行业研究及十四五规划分析报告
  7. 智慧消防三维地理信息应急指挥平台
  8. 谷歌浏览器元素定位神器 -- chropath插件
  9. php中file_get_contents与curl性能比较分析
  10. Excel 录制宏 - 制作工资条