首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >项目开始前准备事项

项目开始前准备事项

作者头像
茶半香初
发布2021-11-26 14:13:48
发布2021-11-26 14:13:48
31400
代码可运行
举报
文章被收录于专栏:程序员那点事程序员那点事
运行总次数:0
代码可运行

目录


1.git提交格式限制的插件安装

2.统一接口返回 ResultBean

代码语言:javascript
代码运行次数:0
运行
复制
{
    "apiInfoDto": {
        "instId": "每次请求唯一id,用于标识每次的请求",
        "requestTime": "string",
        "responseTime": "string",
        "returnCode": 200,
        "returnMsg": "success",
        "returnStatus": "SUCCESS",
        "page": 1,
        "pageSize": 10,
        "currentPageSize": 0
    },
    "respBody": {

    }
}
注意:ResultBean是controller专用的,不允许传递到其它层,比如Service层;日志打印,不准自己打印方法入参,和返回结果,所有这类日志打印通过注解@Log进行日志打印,保证代码简洁,还有统一日志格式,也可防止漏打日志

3.日志打印

1 . ** 不能太依赖debug,应该多依赖日志输出** 2 . 代码开发测试完成之后不要急着提交,先跑一遍看看日志是否看得懂 3 . 这些地方必须打印日志: – 分支语句的变量必须打印日志,重要参数必须打印(比如订单code等); – 修改(包括新增)操作必须打印日志(出问题,做到有证可查); – 数据量大的时候需要打印数据量,及耗时(用于分析性能。比如查询一个列表,要打印结果列表大小)

4 . 日志必须包含哪些信息: – 每次请求的唯一id(便于从海量的日志里区分某次请求); – 每次请求的用户信息(从海量日志里快速找到该用户做了什么);

以上列出了几条日志打印规则,其中加粗的地方,需要自己写代码的时候实现,其余的可通过注解@log配合日志框架sf4j实现,可参考以下几个常用场景的日志打印案例:

  1. 日志信息必须包含每次请求的唯一id和用户信息 只需要在对应方法添加@Log注解即可:

其中红色部分应该删除;打印日志效果如下:

其中红色框部分类容为该次请求的唯一id,绿色部分为该次请求的用户信息,紫色为请求入参和请求出参;

  1. 默认打印info级别的入参和出参 有些方法不一定都要打印出入参和结果的日志,但是有些时候又想默认打印出这些日志,只需添加printInfoLog = true参数即可,默认为false,不答应info日志:

效果如下:

这里打印出来的日志和debug级别日志相同,只是省去了修改日志级别的步骤,系统默认会打印info级别日志;

  1. 过滤掉指定类型的参数不打印 比如这里,我们每个请求都会有一个默认的apiInfoDto参数,大多数时候我们选择不打印,因为打印出来意义不大,还浪费空间,只需要添加excludeInParam = {HmallApiInfoDto.class, BaseApiInfoDto.class}参数即可
  1. 一个请求参数对象太大,我只想打印入参对象的一个字段 比如我想只打印入参的apiInfoDto对象和DepartmentReqDto入参的companyId,只需要增加参数:param = {"departmentReqDto.apiInfoDto","departmentReqDto.companyId"} 效果如下:

– 未指定参数效果如下(中间包含了很多你不想要打印的参数):

– 指定打印入参的apiInfoDto对象和DepartmentReqDto入参的code效果如下:

1. 重要参数,希望在一个方法的每个日志都出现 比如:更新科室时,科室的code,只需要添加参数:itemId = "departmentReqDto.code"

1. 根据日志知道是某个用户做了什么 比如在新增或者删除是,希望记录日志,以备出现问题时有证可查,只需要添加参数:itemType = "department", action = LogConst.Action.U效果如下:

在controller上没有加itemType = "department", action = LogConst.Action.U,所以通过日志信息,我们能理解到的是: 某次请求(id为:9481f40f-de4a-4aad-b52a-8e75879eaad1)的用户hmall_sa对表中的一条数据(code=D100038)进行了操作,具体是什么操作,新增、修改、查询还是删除通过这一条日志没法得知。 而通过Service打出的日志我们能知道: 某次请求,用户hmall_sa对表department中code=D100038的数据进行了更新操作,及更新的具体参数也能看见,这样一条日志就全部展示了这个用户什么时候做了什么操作。 1. 当一个方法返回结果是多个对象,有时候我们只想知道一共有多少个结果,所以此时全部打印出结果,难免有点浪费,可通过参数:printOutParamSize = true来指定,只打印结果大小

4. 异常处理及非空判断

  1. 绝大部分的时候不准捕获异常,应该直接抛出,交controller统一处理。 比如:关闭资源的时候的io异常,可以捕获然后什么都不干,其它异常都自定义异常抛出,由controller统一处理。如果是后台定时任务队列的异常,一样不能捕获异常,应该有个统一的地方处理异常,然后邮件或者短信通知相关人员,这样才能第一时间知道系统出问题了。 注意: 自定义异常时,继承RuntimeException不要继承Exception,这样可以省去异常声明。
  2. 少加空判断。如果对象不应该为空,就不需要加空判断,加了空判断就要测试为空和不为空二种情况。

5. 其它

  1. 建议不要直接调用第三方工具类 原因:直接调用第三方工具类,如果后续涉及工具类的实现逻辑修改,修改的地方就会比较多,而且修改后需要测试的地方也就多。 比如:StringUtils工具类、BeanUtils工具类等,org.springframework.beans.BeanUtils.copyProperties(source, dest)org.apache.commons.beanutils.BeanUtils.copyProperties(dest, source)它们方法的参数顺序和之前工具类是相反的,改起来非常容易出错。如果突然有一天需要改成,复制参数的时候,有些特殊字段需要保留(如对象id)或者需要过滤掉(如密码)不复制,这时候改动的点也会涉及到比较多的地方。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1.git提交格式限制的插件安装
  • 2.统一接口返回 ResultBean
  • 3.日志打印
  • 4. 异常处理及非空判断
  • 5. 其它
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档