技术选型:
spring boot(Spring DATA+Spring MVC+slf+jackson), JDK1.8
接口约定
- 使用RestFul API接口;URL中不要使用动词,如GET,ADD,CREATE等;URL中尽量包含资源唯一标识。参考《互联网开发常识谱–REST》
- 返回参数分成功和失败等不同类型的数据格式。
- 成功返回http status200,参数中不要包含的message_code,message等流程控制信息,而是直接对应业务逻辑对象。
- 业务逻辑失败返回http status 400,返回不同的失败提示信息和失败代码。
异常处理:
- 如果没有业务逻辑处理,则不要捕获异常,sevice层避免仅为打印日常的try-catch。
- 在线程边界必须捕获异常输出日志,异常日志输出必须打印堆栈,并打印关键参数。
- 使用ControllerAdvice拦截所有异常,做http状态转换,失败提示信息和失败代码转换。参考《spring boot 最佳实践(四)–Spring MVC》
- 如果使用异步线程或者自建线程池,必须在线程发起的入口捕获所有异常,并打印日志。
业务逻辑编码:
- 业务逻辑代码不能写在controller和DAO中。
- 基础参数校验在DTO中定义,在controller参数注入时自动校验。参考《spring boot 最佳实践(二)–使用Bean Validation》
- 避免无意义的service层接口声明,如果一个service只有一个实现就不要抽象出接口。
- Info及以上禁止输出大对象,但必须打印关键参数。参数使用“{}”占位符而不是用“+”字符串拼接
- 方法体职责单一,减少嵌套层数,一个方法体不能超过100行。
- 禁止在service层通过动态拼接sql字符串查询DB,使用JPA的Criteria API。
- 禁止魔法数字,尽量使用枚举类型替代静态常量。
- 禁止使用类似Constants的全局常量类,领域对象相关的常量在对象实体类中定义,与业务逻辑相关的常量在对应的service中定义。