SpringBoot项目中Controller层代码编写规范整理

文章目录

  • Controller层代码规范
    • SpringMVC接口定义要注意以下常见的几种问题
      • 1. 返回格式不统一
      • 2. 没有考虑失败情况
      • 3. 出现和业务无关的输入参数

Controller层代码规范

主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点:

  1. 所有函数返回统一的ResultBean/PageResultBean格式;
  2. 没有统一格式,AOP无法玩.
  3. ResultBean/PageResultBean是controller专用的,不允许往后传
  4. Controller做参数格式的转换,不允许把json,map这类对象传到services去,也不允许services返回json、map。

SpringMVC接口定义要注意以下常见的几种问题

1. 返回格式不统一

同一个接口,有时候返回数组,有时候返回单个;成功的时候返回对象,失败的时候返回错误信息字符串。工作中有个系统集成就是这样定义的接口,真是辣眼睛。这个对应代码上,返回的类型是map,json,object,都是不应该的。实际工作中,我们会定义一个统一的格式,就是ResultBean,分页的有另外一个PageResultBean
错误范例:

    //返回map可读性不好,尽量不要 @PostMapping("/delete") public Map<String, Object> delete(long id, String lang) { } // 成功返回boolean,失败返回string,大忌 @PostMapping("/delete") public Objectdelete(long id, String lang) { try { boolean result = configService.delete(id, local); return result; } catch (Exception e) {log.error(e); return e.toString(); } }

2. 没有考虑失败情况

一开始只考虑成功场景,等后面测试发现有错误情况,怎么办,改接口呗,前后台都改,劳民伤财无用功。
错误范例:

//不返回任何数据,没有考虑失败场景,容易返工 
@PostMapping("/update") 
public void update(long id, xxx) { }

3. 出现和业务无关的输入参数

如lang语言,当前用户信息 都不应该出现参数里面,应该从当前会话里面获取。后面讲ThreadLocal会说到怎么样去掉。除了代码可读性不好问题外,尤其是参数出现当前用户信息的,这是个严重问题。
错误范例:

// (当前用户删除数据)参数出现lang和userid,尤其是userid,大忌 
@PostMapping("/delete") 
public Map<String, Object> delete(long id,String lang, String userId) { }
  1. 出现复杂的输入参数
    一般情况下,不允许出现例如json字符串这样的参数,这种参数可读性极差。应该定义对应的bean。(不绝对)

    错误范例:

// 参数出现json格式,可读性不好,代码也难看 
@PostMapping("/update") 
public Map<String, Object> update(long id, String jsonStr) { }
  1. 没有返回应该返回的数据
    例如 口一般情况下应该返回新对象的id标识,这需要编程经验。新手定义的时候因为前台没有用就不返回数据或者只返回true,这都是不恰当的。别人要不要是别人的事情,你该返回的还是应该返回。

    错误范例:

// 约定俗成,新建应该返回新对象的信息,只返回boolean容易导致返工 
@PostMapping("/add") 
public boolean add(xxx) { //xxx return configService.add(); }

很多人看了我的这篇文章程序员你为什么这么累?,都觉得里面的技术也很简单,没有什么特别的地方,但是,实现这个代码框架之前,就是要你的接口的统一的格式ResultBean,aop才好做。有些人误解了,我那篇文章说的都不是技术,重点说的是编码习惯工作方式,如果你重点还是放在什么技术上,那我也帮不了你了。同样,如果我后面的关于习惯和规范的帖子,你重点还是放在技术上的话,那是丢了西瓜捡芝麻,有很多贴还是没有任何技术点呢。
附上ResultBean,没有任何技术含量:

/*** Controller统一返回对象,响应信息主体*/
@Getter
@ApiModel(value = "响应信息主体")
public class R<T> implements Serializable {private static final long serialVersionUID = 1L;/*** 状态码:1成功,其他均为失败【详见错误状态码表】*/@ApiModelProperty(value = "状态码")private int code;/*** 成功为success,其他为失败原因*/@ApiModelProperty(value = "消息")private Object message = "success";/*** 数据结果集*/@ApiModelProperty(value = "数据结果集")private T data;/*** 当前时间*/@ApiModelProperty(value = "时间戳")private final long time = System.currentTimeMillis();public R<T> setMessage(Object message) {this.message = message;return this;}public R<T> setMessage(String format, Object... args) {this.message = new Formatter().format(format, args).toString();return this;}public R() {}/*** 使用枚举类中模版消息** @param resultConstant ResultConstant* @param data           数据结果集*/private R(ResultConstant resultConstant, T data) {this.code = resultConstant.getCode();this.message = resultConstant.getMessage();this.data = data;}public static <T> R<T> ok() {return restResult(ResultConstant.SUCCESS, null, null);}public static <T> R<T> ok(T data) {return restResult(ResultConstant.SUCCESS, null, data);}public static <T> R<T> ok(T data, Object message) {return restResult(ResultConstant.SUCCESS, message, data);}public static <T> R<T> failed(ResultConstant resultConstant) {return restResult(resultConstant, null, null);}public static <T> R<T> failed(ResultConstant resultConstant, Object message) {return restResult(resultConstant, message, null);}public static <T> R<T> failed(ResultConstant resultConstant, Object message, T data) {return restResult(resultConstant, message, data);}private static <T> R<T> restResult(ResultConstant resultConstant, Object message, T data) {R<T> apiResult = new R<>(resultConstant, data);if (null != message) {apiResult.setMessage(message);}return apiResult;}
}

统一的接口规范,能帮忙规避很多无用的返工修改和可能出现的问题。能使代码可读性更加好,利于进行aop和自动化测试这些额外工作。

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

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

相关文章

如何从一张图片里取出其中一部分_如何鉴别坑人的锌合金龙头

01.对大部分人而言&#xff0c;锌合金龙头是一个熟悉又陌生的词儿。当我们提起锌合金龙头时&#xff0c;很多人会一脸茫然的回答&#xff1a;啥&#xff1f;锌合金龙头&#xff1f;没听过&#xff01;不认识&#xff01;但在日常生活中锌合金龙头的出现率可不低&#xff01;不信…

Boolean()

一、 尝试把括号里面值转换为布尔值。 二、 只要是六个表示 false 之外的&#xff08;false / null / undefined / NaN / ""&#xff09;&#xff0c;都是 true let demo undefined; let num Boolean(demo); console.log(typeof(num) : num); // Boolean : f…

SpringBoot框架中各层(DTO、DAO、Service、Controller)理解

粗略理解 View层→Controller层&#xff08;响应用户请求&#xff09;→Service层&#xff08;接口→接口实现类&#xff09;→DAO层&#xff0c;即Mapper层&#xff08;抽象类&#xff1a;xxxMapper.java文件&#xff0c;具体实现在xxxMapper.xml&#xff09;→Model层&#…

verilog找不到模块_工欲善其事,必先利其器 verilog编辑器搭建

一款合适的编辑器能够大大提高我们代码的编写速度&#xff0c;而sublime就是一款非常强大的编辑器&#xff0c;它在拥有丰富的插件的同时&#xff0c;也具备非常美型的外观。sublime是一款免费的编辑器&#xff0c;虽然不进行购买的话会时不时地提示购买&#xff0c;但是无视就…

toString(radix)

一、一般用来做进制转换&#xff0c;括号里面就是填进制数 二、 把其它类型的变量转换字符串类型&#xff0c;少用&#xff0c;一般要转换为字符串拼接一个空字符串就可以了 let num 1 ; console.log(typeof(num) : num); // string : 1let demo 1234; let num demo.t…

Springboot中几个层的功能总结

具体的一个web项目中是&#xff1a;Controller层调用了Service层的具体功能方法&#xff0c;Service层调用Dao层的方法&#xff0c;其中调用的参数是使用Entity层进行传递的 下面我们来了解一下各个层的功能及作用: Service层&#xff1a; 业务层–>控制业务 ; service层…

python 分类变量转为哑变量_python 虚拟变量

# -*- coding: utf-8 -*-import pandasdata pandas.read_csv(D:\\PDA\\4.18\\data.csv,encodingutf8)data[Education Level].drop_duplicates()"""博士后 Post-Doc博士 Doctorate硕士 Masters Degree学士 Bachelors Degree副学士 Associa…

log4j2漏洞

log4j2漏洞 这个漏洞到底是怎么回事&#xff1f; 怎么利用这个漏洞呢&#xff1f; 我看了很多技术分析文章&#xff0c;都太过专业&#xff0c;很多非Java技术栈或者不搞安全的人只能看个一知半解&#xff0c;导致大家只能看个热闹&#xff0c;对这个漏洞的成因、原理、利用…

python游戏csgo开挂_Python64位游戏读写--GTA锁血

37.jpg (19.22 KB, 下载次数: 1)2020-6-23 09:32 上传EPIC送了GTA5&#xff0c;最近考完试和朋友一起玩了下&#xff0c;由于刚开始&#xff0c;等级低&#xff0c;朋友带我打任务的时候&#xff0c;完全就打不过&#xff0c;我的甲没几下就爆了&#xff0c;刚开始没什么。但是…

log4j2 的使用【超详细图文】

log4j2 的使用 Apache Log4j2 是对Log4j 的升级版本&#xff0c;参考了logback 的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 异常处理&#xff0c;在logback中&#xff0c;Appender中的异常不会被应…

python标准库os的方法listdir_Python 标准库 os 中的方法 listdir() 返回包含指定路径中所有文件和文件夹名称的列表。_药理学答案_学小易找答案...

【单选题】下列( )是脂肪酸 (2.0分)【单选题】关于固醇类的叙述,错误的是( ) (2.0分)【单选题】细胞膜的主动转运( ) (2.0分)【单选题】脂肪的碱水解作用又称为( ) (2.0分)【名词解释】比活力【简答题】4、什么是米氏方程,米氏常数 Km 的意义是什么?试求酶反应速度达到最大反应…

JS遍历数组的12种方法

一、 for 普通版 for (let i 0; i < arr.lengthl; i) {// ... }优化版 // 使用临时变量&#xff0c;将长度缓存起来&#xff0c;避免重复获取数组长度&#xff0c;当数组较大时优化效果才会比较明显。 let len arr.length; for (let i 0; i < len; i) {// ... }for…

Log4j2突发重大漏洞

长话短说吧。 相信大家已经被 Log4j2 的重大漏洞刷屏了&#xff0c;估计有不少小伙伴此前为了修 bug 已经累趴下了。很不幸&#xff0c;我的小老弟小二的 Spring Boot 项目中恰好用的就是 Log4j2&#xff0c;版本特喵的还是 2.14.1&#xff0c;在这次漏洞波及的版本范围之内。…

不改变原数组的一些方法

改变原数组 push / pop / shift / unshift / sort / reverse / splice 不改变原数组 concat / join --> split / toString / slice 一、 concat — 数组合并 var arr [1, 2, 3]; var arr1 [4, 5, 6]; console.log(arr.concat(arr1)); // [1, 2, 3, 4, 5, 6];二、 toStri…

python描述对象静态特性的数据为_对于需要几个单位共同负担的一张原始凭证上的支出,应根据其他单位负担部分为其提高( )。...

【单选题】字符串s是一个字符序列,以下表示s从右侧向左第三个字符的是: ‪‪‪‫‪‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪【多选题】我国《婚姻法》规定夫妻人身关系的内容包括 ( )【填空题】白露横江【多选题】我国《婚姻法》规定的婚姻成立的实质…

PageHelper分页插件源码及原理剖析

摘要: com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件。 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件&#xff0c;其实我并不想加上好用两个字&#xff0c;但是为了表扬插件作者开源免费的崇高精神&#xff0c;我毫不犹豫…

arguments 类数组

一、类数组&#xff1a;长得像数组&#xff0c;可以拿它当数组用&#xff0c;但它不是数组 可以利用属性名模拟数组的特性可以动态的增长 length 的属性如果强行让类数组调用 push 方法&#xff0c;则会根据 length 属性值的位置进行属性的扩充 二、不能往类数组里面添加东西…

净网大师最好用旧版本_云顶之弈手把手教你吃分系列:决斗大师

很忏愧&#xff0c;这个阵容并非我原创&#xff0c;也是我偷师而来&#xff0c;不过最近一直在用&#xff0c;效果也不错&#xff0c;所以主要会讲讲心得&#xff0c;而不是原先的基础。先看阵容构成&#xff1a;亚索(天选决斗大师)、剑姬、武器、风女、卡莉斯塔/赵信、慎、永恩…

PageHelper 关闭COUNT(0)查询 以及PageHelper 的分页原理分析

pagehelper 关闭count(0)查询 以及pagehelper的分页原理分析 情景再现&#xff1a;在给移动端提供分页查询数据接口时&#xff0c;知道他们不需要总条数。但是使用pagehelper 分页查询打印的sql总是会查询两次&#xff0c;先统计条数&#xff0c;在进行列表查询。对于有点强迫…

local service system账户_systemd.service学习和使用总结

公众号&#xff1a;暮北林 Q Q 群 : 一起学前端Systemd Service 学习和使用总结什么是Systemd servicesystem就是系统,d的意思是daemon,systemd就是系统守护进程,守护系统级的服务.我的个人理解就是管理系统服务的工具,可以对系统服务做一些操作,如:启动、结束、重启等,这里我…