@modelattribute注解用postman测试怎么传参_谁要是再敢用Map传参,我过去就是一JIO...

a7d9f4b93b21ed0fde3d289ce533bc84.png

还记得上次我写过一篇关于实际项目代码分层和规划的文章《看完这篇,别人的开源项目结构应该能看懂了》, 在文尾处提到过一些注意事项,其中第一条就是:

  • Contorller层参数传递建议不要使用HashMap,推荐使用数据模型定义

私信里竟然有很多小伙伴提问说,为什么不能这样做?

我心里暗自寻思:难道这么做的小伙伴都没有被同事捶吗?(滑稽)

得嘞,今天咱们就掰扯掰扯这件事,这是实际写代码时常忽略的一个问题


是不是有人也这么写过?

我自己曾经接手过一个前人留下来的老项目,拿到代码,导入IDEA的那一刻,我哭出了声。

806759824050e505335999da29df49d5.png

因为它的Controller层代码都是类似这样写的:

@RestController
@RequestMapping("/index")
public class IndexController {

    // 获取App首页内容
    @PostMapping("/getIndexContent")
    public ResponseWrapper getIndexContent( @RequestBody Map paramMap ) {

        ResponseWrapper res = new ResponseWrapper();

        // 下面开始做传参有效性的校验
        if (!paramMap.containsKey("article_id")) {
            res.setCode(500);
            res.setMsg("缺少 article_id 信息");
            return res;
        }

        if (!paramMap.containsKey("page")) {
            res.setCode(500);
            res.setMsg("缺少 page 信息");
            return res;
        }

        if (!paramMap.containsKey("size")) {
            res.setCode(500);
            res.setMsg("缺少 size 信息");
            return res;
        }

        if (!paramMap.containsKey("version")) {
            res.setCode(500);
            res.setMsg("缺少 version 信息");
            return res;
        }

        // ...... 此处省略

    }

    // ...... 此处省略

}

别的咱先不说,居然明目张胆地在Controller层里方法里用Map传参?!简直丧心病狂了。幸亏下面还有一波传参有效性的验证,对于传递的参数,我好歹也能猜个大概,不然那真是喵了个咪了。

接下来,我们就好好唠一唠:为什么不要在Controller层传参时使用Map类型!


Map一时爽,维护爽歪歪

正好,这地方有一个咱小伙伴活生生的例子。

前段时间,有个小伙伴跟我提问交流,说他接手了一个别人的老项目,问了我一个类似这样的问题:

8eb7c798463cd2d2443a2c9342306eac.png

看到没!

Map传参的第一个(也是最大的一个)弊端就是:这会导致后续接手和维护的人怀疑自己的人生,因为他根本不知道代码传的啥参数,想要构造参数去调试接口只能靠脑补摸瞎、以及猜测了。

试想一下,其实我们代码里任何一个地方的传参都可以使用Map来传,如果真的这么做了,代码中连任何数据模型类都不需要定义了,果真如此的话,这样的代码咱能看懂吗?

而且这位小伙伴接手的项目居然还用的是LinkedHashMap参数,可以说很秀了。

ee1dc34de3d6e13082a3f13ce17dd9a8.gif

除此之外,紧接着还会带来下面这个问题。


好用的API工具与你无缘了

我之前写过一篇文章《前后端都分离了,该搞个好用的API管理系统了!》,聊过现在市面上一些比较好用的、能极大提升前后端开发效率的API管理工具,这对于前后端开发来说,简直是莫大的福音。

我们就以Swagger这个API工具为例,如果Controller传参使用Map的话:

// 获取App首页内容
@ApiOperation("获取App首页内容")
@PostMapping("/getIndexContent")
public ResponseWrapper getIndexContent( @RequestBody Map paramMap ) {

    // ...... 此处省略

}

API工具无法读取具体参数项目和参数类型,所以传参什么的也看不出来:

a7b1de3544e16704ad36334f8eb4138b.png

换言之,我如果将上面的Map传参改为自定义数据模型类IndexQueryDto来传参的话:

// 获取App首页内容
@ApiOperation("获取App首页内容(改造后)")
@PostMapping("/getIndexContent")
public ResponseWrapper getIndexContent( @RequestBody IndexQueryDto indexQueryDto ) {

    // ...... 此处省略

}
@ApiModel(value = "App首页内容请求参数实体对象")
class IndexQueryDto {

    @ApiModelProperty(value = "文章ID号")
    @NotNull(message = "缺少 article_id 信息")
    private Long article_id;


    @ApiModelProperty(value = "页面数")
    @NotNull(message = "缺少 page 信息")
    private Integer page;

    @ApiModelProperty(value = "每页条目数")
    @NotNull(message = "缺少 size 信息")
    private Integer size;

    @ApiModelProperty(value = "App版本号")
    @NotNull(message = "缺少 version 信息")
    private String version;

    // ...... 此处省略set/get方法

}

则类似Swagger这种API工具就非常方便地能帮助我们管理参数了:

05737df0cf869168dd24fb081bd3002f.png

这样不管是自己调试,还是前、后端对接口都会方便得多。


同理,除了Swagger这种API管理工具之外,像在我的前文《没用过这些IDEA插件?怪不得写代码头疼》中推荐过的一个非常好用的接口管理插件RestfulToolkit也无法识别出Map类型所盛放的具体参数:

35ea7ccf7682427885ad8e333fd059dd.png

但是对于数据模型的定义参数,就能非常清晰的给出参数细节,并方便地提供接口测试:

33b80196fe2638ea90ec37d96a46f0e6.png

优秀的注解没法使用了

还是以文章开头举例的代码来说,不管怎么样,写这段代码的哥们还是负责的,毕竟兢兢业业地用手工连环if()判断完成了所有参数的有效性校验:

5230dbeac0e5b1eb34df48a785b8a228.png

但问题是,我们真的需要这种辣眼睛的手工连环if()判断来做参数校验吗?

13762cc8d4ee0e707c4fea1c8d7b2711.png

同样在前文《啥?听说你还在手写复杂的参数校验?》中也说过了,我们其实可以通过注解来方便地规避繁杂的参数校验工作,但前提是不能使用Map类型传参,需要使用数据模型的定义,就像这样:

class IndexQueryDto {

    @NotNull(message = "缺少 article_id 信息")
    private Long article_id;

    @NotNull(message = "缺少 page 信息")
    private Integer page;

    @NotNull(message = "缺少 size 信息")
    private Integer size;

    @NotNull(message = "缺少 version 信息")
    private String version;

    // ...... 此处省略get/set方法
}

一个NotNull注解即可搞定,它不香吗?


Map传参真的一无是处吗?

有些小伙伴表示用Map传参的好处就是可以随意扩展,后期变动灵活,想往里面塞几个参数就塞几个参数;而且也省去了各种对象定义和命名的烦恼。

6f8b2f4eeff57de0c6a59c717544c192.png

如果非要用Map传参

如果实在不能避免用Map传参,也麻请配备完备的测试用例吧,省得让后来接手维护的人天天看着代码怀疑人生了。

通过测试用例,后来接手维护的人也能快速搞清代码间的参数传递和调用,不然真的只能靠脑补画面去调试了。


嘘...

好了,说了这么多,如果你项目的`Controller层代码还在使用HashMap传参的话,答应我,二话别说,赶快全部偷偷去改掉,快!速度!跑步前进!

e21815bc9215c3f9b7743585e5bff4e6.png

每天进步一点点,Peace!

2020.04.02晚

给个[在看],是对程序羊最大的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「反向传播非你原创」,Jürgen发文直指Hinton不应获2019本田奖

来源:机器之心LSTM 之父 Jrgen Schmidhuber 再次掀起争论,这回他指向了深度学习之父、图灵奖得主 Geoffrey Hinton。不过,这次他站出来质疑的是 Hinton 的最新奖项——本田奖。创立于 1980 年的本田奖旨在表彰「为引领生态技术领域的下一代新…

操作文件 -------JavaScrip

本文摘要&#xff1a;http://www.liaoxuefeng.com/ 在HTML表单中&#xff0c;可以上传文件的唯一控件就是<input type"file">。 注意&#xff1a;当一个表单包含<input type"file">时&#xff0c;表单的enctype必须指定为multipart/form-data&…

半导体未来浪潮(深度好文)

本文资料来源于自德勤报告《半导体&#xff1a;未来浪潮》01新格局&#xff1a;全球半导体行业不断演化在过去几年&#xff0c;全球半导体行业增长主要依赖智能手机等电子设备的需求&#xff0c;以及物联网、云计算等技术应用的扩增。预计全球半导体行业增长态势有望持续至下一…

python数据运算

算数运算&#xff1a; 比较运算&#xff1a; 赋值运算&#xff1a; 逻辑运算&#xff1a; 成员运算&#xff1a; 身份运算&#xff1a; 位运算&#xff1a; 运算符优先级&#xff1a; 转载于:https://www.cnblogs.com/ne-zha/p/7136920.html

mysql单台跨数据库查询_在MySQL中怎样进行跨库查询?

在MySQL中跨库查询主要分为两种情况&#xff0c;一种是同服务的跨库查询&#xff1b;另一种是不同服务的跨库查询&#xff1b;它们进行跨库查询是不同的&#xff0c;下面就具体介绍这两种跨库查询。一、同服务的跨库查询同服务的跨库查询只需要在关联查询的时候带上数据名&…

宇宙膨胀背后的故事(卅三):宇宙之有生于无

本文来自程鹗科学网博客1969年&#xff0c;卡特和霍金的导师、剑桥大学宇宙学家夏玛&#xff08;Dennis Sciama&#xff09;在哥伦比亚大学讲学。在他话语停顿的间隙&#xff0c;有人突然迸出一句&#xff1a;“也许宇宙就是一个真空涨落&#xff08;vacuum fluctuation&#x…

《自然》 脑机接口新突破 人脑信号转文本准确率达97%

来源&#xff1a;网易智能据国外媒体报道&#xff0c;一个由加州大学旧金山分校的研究团队打造的新型人工智能系统可根据人脑信号来生成文本&#xff0c;准确率最高可达97%。亚马逊和谷歌等科技公司打造的虚拟助手相当先进&#xff0c;语音识别能力比起几年前进步惊人&#xff…

mysql 取月份天数_mysql 之 获取指定月份天数和指定月份上月天数

1.语法DAY(LAST_DAY(CONCAT(nc_date,01)))AS cm_day_cnt, -- 当月天数DAY(LAST_DAY(DATE_SUB((CONCAT(nc_date,01)),INTERVAL 1 MONTH))) -- 上月天数2.解析我的nc_date 是 202004&#xff0c;因此要使用concat 连接01 &#xff0c;形成完整的日期LAST_DAY()函数&#xff0c;获…

tomcat各目录(文件)作用

1.bin bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的&#xff08;linux命令&#xff09;&#xff0c;另一类是以.bat结尾的&#xff08;windows命令&#xff09;。 重要&#xff1a; 很多环境变量的设置都在此处&#xff0c;例如可…

对外星智能的搜索得到了重大的升级

Photo: iStockphotoRadio antenna dishes of the Very Large Array radio telescope near Socorro, New Mexico.来源&#xff1a;IEEE电气电子工程师我们都曾一度怀疑宇宙中其他地方是否存在智慧生命。加州大学伯克利分校&#xff08;University of California Berkeley&#x…

打开脑科学研究的另一扇窗:脑神经化学活体原位电化学分析新技术

来源&#xff1a;brainnews脑科学是目前国际前沿科技的热点研究领域之一&#xff0c;对脑功能的研究有助于理解人类认知、情感等复杂生理过程的本质&#xff0c;以及神经系统疾病的形成和发展规律。脑神经信号的传递以及代谢过程都离不开化学物质的参与&#xff0c;因此&#x…

人工智能下一阶段,为啥要看互联网巨头?

来源&#xff1a;财讯网回顾过去的十余年&#xff0c;人工智能的进步可谓“耀眼”。尤其是从2015年“阿法狗”横空出世之后&#xff0c;人工智能行业的发展速度一骑绝尘。归根结底&#xff0c;是人类在人工智能领域探索50余年&#xff0c;最终才在半导体技术和软件技术的帮助下…

日本科学家:可观测宇宙中,我们可能是唯一的生命

图片来源&#xff1a;Pixabay长期以来&#xff0c;人类一直渴望在宇宙中找到地外生命的痕迹&#xff0c;但一项于今年早些时候发表的研究&#xff0c;给持有此类想法的人泼了一盆冷水。基于“自然发生”学说以及其中的“RNA世界”假说&#xff0c;研究人员认为在可观测宇宙中&a…

go 接口 构造器_Go 中接口值的复制

我一直在思考 Go 语言它是如何工作的。直到最近我才发现 Go 中一切都是基于值的。当我们向函数传递参数、迭代切片、执行类型断言时我们都可以看到这一现象。在这些例子中&#xff0c;这些数据结构所存储的值的拷贝会被返回。当我刚开始学习 Go 的时候&#xff0c;我对于这种实…

【人工智能】人工智能革命与机遇

来源 | 北大AI公开课编辑 | Vincent、Natalie课程导师&#xff1a;雷鸣&#xff0c;天使投资人&#xff0c;百度创始七剑客之一&#xff0c;酷我音乐创始人&#xff0c;北京大学信科人工智能创新中心主任&#xff0c;2000年获得北京大学计算机硕士学位&#xff0c;2005年获得斯…

laravel log 对象_swoole运行模式加速laravel应用的详细介绍(life)

本篇文章给大家带来的内容是关于swoole运行模式加速laravel应用的详细介绍&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。我的官方群点击此处。一、SwooleSwoole号称重新定义了PHP&#xff0c;它是一个PHP扩展&#xff0c;使…

OVS+DPDK Datapath 包分类技术

本文主体内容译于[DPDK社区文档]&#xff0c;但并没有逐字翻译&#xff0c;在原文的基础上进行了一些调整&#xff0c;增加了对TSS分类器的详细阐述。 1. 概览 本文描述了OVSDPDK中的包分类器(datapath classifier -- aka dpcls)的设计与实现思路。本文的内容主要牵涉到分类器对…

mysql第五章 在线测试_PHP+MySQL来实现在线测试quiz功能

在上一篇文章中&#xff0c;我们介绍了jQuery前端PHP在线测试题效果。这篇文章将结合实例给大家介绍如何使用jQueryPHPMySQL来实现在线测试题&#xff0c;包括动态读取题目&#xff0c;答题完毕后台评分&#xff0c;并返回答题结果。查看演示下载资源&#xff1a;1332次 下载资…

深度揭秘AI换脸原理,为啥最先进分类器也认不出?

文章来源&#xff1a;VentureBeat&#xff0c;arXiv智东西4月20日消息&#xff0c;AI换脸已不是新鲜事&#xff0c;手机应用市场中有多款换脸app&#xff0c;此前也曾曝出有网络IP用明星的面孔伪造色情影片、在大选期间用竞选者的脸制作虚假影像信息等。为了规避Deepfake滥用带…

中美德工业互联网路径比较

转自丨无锡情报所作者丨王喜文&#xff0c;九三学社中央促进技术创新工作委员会委员、九三学社中央科技委委员过去20年&#xff0c;互联网是改变社会、改变商业最重要的技术&#xff1b;如今&#xff0c;随着5G、物联网以及云计算和大数据、区块链、人工智能技术的迅速发展&…