文章目录

  • 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和自动化测试这些额外工作。

SpringBoot项目中Controller层代码编写规范整理相关推荐

  1. springboot中controller层代码优雅写法

    在基于spring框架的项目开发中,必然会遇到controller层,它可以很方便的对外提供数据接口服务,也是非常关键的出口,所以非常有必要进行规范统一,使其既简洁又优雅. controller层的职 ...

  2. dao层和service层和control_maven分模块构建SSM普通web项目:service层代码编写

    接着编写service层的代码. 1.service接口及其实现类 新建service包用于放service接口,还有,新建service.impl包放接口的实现类.如下图,BookService和其 ...

  3. .NET代码编写规范 整理

    .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lenspe.blogbus.com/ ...

  4. SpringBoot项目中遇到的BUG

    1.启动项目的时候报错 1.Error starting ApplicationContext. To display the auto-configuration report re-run you ...

  5. J2EE项目代码编写规范分享

    码编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯. 代码编写规范使用范围:J2EE项目开发. 包命名规范: 目的:包的命名规范应当体现出项目资源良好的划分 servle ...

  6. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常

    springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 参考文章: (1)springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 (2)https: ...

  7. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL、利用QueryDSL实现单表RUD、新增类初始化逻辑...

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  8. springboot项目中利用@WebFilter注解和@Bean配置类两种方式实现Filter过滤器

    过滤器(Filter) 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理.通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 ...

  9. 亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像)

    亲测简单易懂可用:阿里云OSS入门实战2(集成到SpringBoot项目中存放用户头像) 大噶好,我们继续延续上一章,学习如何使用OSS存放用户头像代码示例; 在application.propert ...

最新文章

  1. HashMap和HashTable区别
  2. TB级微服务海量日志监控平台
  3. 海归技术大佬:硅谷科技公司到底牛在哪里?讲透“奈飞文化”8个原则!
  4. MyBatis及Spring事务初学总结
  5. java数字转大写 其他报异常_【踩坑系列】使用long类型处理金额,科学计数法导致金额转大写异常...
  6. 科大星云诗社动态20211205
  7. Qt程序单次启动(QSingleApplication类)
  8. Python网络爬虫第二弹《http和https协议》
  9. Android之提示javax.net.ssl.SSLHandshakeException: Chain validation failed
  10. BFPTR算法详解+实现+复杂度证明
  11. 工作309:uni-获取vuex里面的值
  12. mybatis 多对多 处理
  13. 博客资源网小程序带流量主激励视频收益
  14. sqlalchemy Column Elements
  15. clickhouse 复杂查询时嵌套连接join可能存在的异常解决(xjl456852原创)
  16. Linux的目录说明
  17. visio保存高清图片
  18. 【APICloud入门教程】教你从零使用模块及多端组件
  19. Android个人日记本开发背景,毕业设计(论文)-手机app移动开发论文个人心情日记本的设计实现 .doc...
  20. 华为终端穿戴软件测试,【华为终端测试面试】说说群面,可谓是 最...-看准网...

热门文章

  1. android获取短信息,从其ID Android获取短信详细信息
  2. PHP有表单和js交互乱码问题,js 和 php交互问题
  3. python二分法查找程序_查找Python程序的输出| 套装2(基础)
  4. 计算机课伤害事故的防范,体育课安全伤害事故的防范与处理
  5. java.io和util的区别_Java NIO与IO的区别和比较
  6. else 策略模式去掉if_java – 用状态/策略模式替换if/else逻辑
  7. excel数据平均分配给多人_excel表格 怎样均分数据-用Excel怎么才能将组数据平均分配给几个人...
  8. ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...
  9. 面试官:this和super有什么区别?this能调用到父类吗?
  10. 保姆级教学:缓存穿透、缓存击穿和缓存雪崩!