目录

[TOC]


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

2.统一接口返回 ResultBean

{
    "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,绿色部分为该次请求的用户信息,紫色为请求入参和请求出参;
  2. 默认打印info级别的入参和出参
    有些方法不一定都要打印出入参和结果的日志,但是有些时候又想默认打印出这些日志,只需添加printInfoLog = true参数即可,默认为false,不答应info日志:

    效果如下:

    这里打印出来的日志和debug级别日志相同,只是省去了修改日志级别的步骤,系统默认会打印info级别日志;
  3. 过滤掉指定类型的参数不打印
    比如这里,我们每个请求都会有一个默认的apiInfoDto参数,大多数时候我们选择不打印,因为打印出来意义不大,还浪费空间,只需要添加excludeInParam = {HmallApiInfoDto.class, BaseApiInfoDto.class}参数即可
  4. 一个请求参数对象太大,我只想打印入参对象的一个字段
    比如我想只打印入参的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)或者需要过滤掉(如密码)不复制,这时候改动的点也会涉及到比较多的地方。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐