# base-spring-boot-starter **Repository Path**: qiun/base-spring-boot-starter ## Basic Information - **Project Name**: base-spring-boot-starter - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # base-spring-boot-starter 基于spring boot2的面向接口编程框架 ## 使用手册 - 规范 - [开发设计规范](doc/开发设计规范.md) - [日志使用规范](doc/日志使用规范.md) - [RESTFUL接口设计规范](doc/RESTFUL接口设计规范.md) - [模块说明](doc/模块说明.md) - 框架使用手册 - [代码生成](doc/代码生成.md) - [代码生成(Controller)](doc/代码生成(Controller).md) - [配置中心](doc/配置中心.md) - [数据字典](doc/数据字典.md) - [数据字典类生成](doc/生成数据字典类.md) - [统一返回](doc/统一返回.md) - [统一异常](doc/统一异常.md) - [统一消息](doc/统一消息.md) - [唯一序列号](doc/唯一序列号.md) - [加密解密](doc/加密解密.md) - [参数校验(spring,dubbo)](doc/参数校验.md) - [数据库操作注意事项](doc/数据库操作注意事项.md) - [返回String类型数据的特殊处理](doc/返回String类型数据的特殊处理.md) - 框架特性 - [1. 面向接口开发](#面向接口开发) - [2. 参数校验](#参数校验) - [3. 特殊序列化返回](#特殊序列化返回) - [3.1 数据字典注解@DictField](#增加数据字典注解dictfield) - [3.2 增加保留时间戳的注解@DateRaw](#增加保留时间戳的注解dateraw) - [4. 关于http序列化json](#关于http序列化json) - [5. 幂等](#幂等) - [5.1 dubbo幂等](doc/dubbo幂等调用.md) - [5.2 rocketMQ幂等](doc/rocketMQ幂等.md) - [5.3 HTTP接口幂等](doc/HTTP接口幂等.md) ## 框架目标 ![框架效果图](doc/images/all.png) ## 面向接口开发 为了提高复用,更好的扩展性 ```java @RestController @RequestMapping("/order") @Doc("小程序用户端订单相关") //注解在类上,表示接口分组,不同的类可以用相同的名称来合并接口 @Validated public interface OrderService { @Doc("下单接口") //注解在方法上,表示接口名称 @PostMapping(value = "/create") OrderVo createOrder(OrderDto dto);//接口会自动解释OrderDto类的成员属性为参数 @Doc(value = "取消订单接口", scope = false) //注解在方法上,表示接口名称 scope=false表示不解释方法中的参数,而直接采用方法上的Doc注解所写的为接口参数 @Doc(name = "orderId", value = "订单id", required = true) @PostMapping(value = "/cancel") Boolean cancelOrder(@NotNull(message = "2010000=订单id不能为空") Long orderId); @Doc("更换销售接口") @Doc(name = "orderId", value = "订单id", required = true) //作为方法中参数的补充 name要于方法中参数名相同 @Doc(name = "sellerId", value = "销售顾问id", required = true) //作为方法中参数的补充 name要于方法中参数名相同 @PostMapping(value = "/seller/change/{orderId}") @ReturnDoc("true:更换成功 false:更换失败") //对于返回基本类型数据(及其包装类型)的方法作额外补充 Boolean changeSeller(@PathVariable Long orderId, @NotNull(message = "2010007=销售顾问id不能为空") Long sellerId); @Doc("查询订单列表接口") @GetMapping(value = "/list/get") @ParameterFilter(excludes={"page"}, requires={"size"}) //该注解可以设置必传参数,忽略参数,仅包含的参数 此处是排除PageDto中属性page作为参数,并把属性size设置成必传 List getOrderList(PageDto dto); @Doc("查询订单详情接口") @GetMapping(value = "/detail/{orderId}") @Doc(name = "orderId", value = "订单id", required = true) @ReturnFilter(excludes={"creatorId"}) //过滤响应数据OrderDetailVo中的creatorId属性 该注解通常是用来过滤敏感数据 OrderDetailVo getOrderDetail(@PathVariable Long orderId); } ``` ## 参数校验 支持参数校验,消息定义格式为7位校验码加具体消息,如下 ![参数校验](doc/images/valid_parameter.png) ![校验异常返回](doc/images/valid_return.png) 校验码的定义与异常的定义一样,共7位,1开头为系统异常,2开头为业务异常,3开头为参数异常 由于spring支持参数别名,但校验框架无法获取(还需继续研究,目前最好不要取别名) ## 特殊序列化返回 ### 增加数据字典注解@DictField 注解在javabean的属性上,类型需为String, Integer ```java @Doc(value="地址类型", remark="1:省级地点 2:市级地点") @TableField // @JSONField(format = "DICT_TYPE_KEY", serializeUsing = DictSerializer.class) @DictField("DICT_TYPE_KEY") public Integer type; ``` 返回的json ```json { "addrInfo":{ "address":"uuuuu", "id":131331321, "type":2, "typeText":"市级地点" }, "address":"ksldkslkd", "createTime":"2020-05-21 18:14:39", "createTimeRaw":1590056079068, "id":13133131, "name":"张三", "type":1, "typeText":"省级地点" } ``` 在相应的type属性上多了一个typeText的属性 ### 增加保留时间戳的注解@DateRaw 注解在javabean的属性上,类型需为Date javabean ```java @DateRaw @JSONField(format="yyyy-MM-dd HH:mm:ss") public Date createTime; ``` 返回的json ```json { "addrInfo":{ "address":"uuuuu", "id":131331321, "type":2, "typeText":"市级地点" }, "address":"ksldkslkd", "createTime":"2020-05-21 18:14:39", "createTimeRaw":1590056079068, "id":13133131, "name":"张三", "type":1, "typeText":"省级地点" } ``` 在相应的createTime属性上多了一个createTimeRaw的属性 ## 关于http序列化json - **指定JSON消息转换器** 默认的序列化采用的是fastjson,如果想用spring自带的jackson返回,可以在响应头上指定,如header增加 ```java "jackson":"true" ``` - **忽略统一消息封装** 在方法上 ```java @GetMapping("/show/{id}") @ReturnFilter(ignoreCriterion = true) //忽略统一消息封装 public Address show(@PathVariable Long id) { //方法 } ``` - **过滤数据**