八、微服务进阶之公共模块(自定义异常和统一返回体)

八、微服务进阶之公共模块(自定义异常和统一返回体)

功能介绍

封装全局的常量或枚举、自定义业务异常以及统一数据返回封装体

目录结构
  1. base 包下 ExceptionBase 为所有业务异常枚举的父接口类,ResultResponse 为全局统一返回数据的封装体;
  2. constants 包下即一些全局常量或枚举定义;
  3. exception 包下 FatCatException 即为封装的自定义业务异常。
代码展示

全局数据统一返回体 ResultResponse

@Data
@NoArgsConstructor
public class ResultResponse implements Serializable {
    private static final long serialVersionUID = 5859098504073316951L;
    /** * 响应编码 */
    private int code;
    /** * 数据补充说明 */
    private String message;
    /** * 数据实体 */
    private Object data;
    /** * 当前请求数据是否成功;异常或错误均设置为false */
    private Boolean success;

    /** * 注意当前构造函数属于私有方法,防止不规范的编码和数据传递 */
    private ResultResponse(int code, String message, Object data, Boolean success) {
        this.code = code;
        this.message = message;
        this.data = data;
        this.success = success;
    }

    /** * 返回成功时 */
    public static ResultResponse success(Object data) {
        return new ResultResponse(ExceptionEnum.SUCCESS.code(), ExceptionEnum.SUCCESS.message(), data, Boolean.TRUE);
    }

    /** * 返回失败时 */
    public static ResultResponse failure(FatCatException ex) {
        return new ResultResponse(ex.getCode(), ex.getMessage(), null, Boolean.FALSE);
    } // 其他静态方法
}

全局自定义业务异常

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class FatCatException extends RuntimeException {
    private static final long serialVersionUID = -7056527073546705020L;
    /** * 响应编码 */
    private int code;
    /** * 数据补充说明 */
    private String message;

    /** * 仅一个接收指定枚举类的构造,防止不规范的参数传递 */
    public FatCatException(ExceptionBase ex) {
        this.code = ex.code();
        this.message = ex.message();
    }
}
常用依赖

常用工具依赖

<properties>
    <hutool.version>5.6.2</hutool.version>
    <lombok.version>1.18.12</lombok.version>
    <fastjson.version>1.2.76</fastjson.version>
    <mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<dependencies>
    <!-- hutool 工具 -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>${hutool.version}</version>
    </dependency>
    <!-- 常用注解依赖 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
    <!-- fastjson 弥补 hutool 的 json 转换 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>${fastjson.version}</version>
    </dependency>
    <!-- 对象属性复制工具 -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-jdk8</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${mapstruct.version}</version>
    </dependency>
</dependencies>
补充说明
  1. hutool 工具已经包含了 json 数据的转换,为什么还要引入 fastjson ?
    • 答: hutool 使用的是 jackson 的序列化和反序列化,针对时间类型的数据会转换成时间戳,fastjson 对时间类型的转换会转换成字符串;其实只要保证序列化和反序列化一致即可
  2. hutool 包中已经有了 BeanUtil 属性复制工具,为什么还要引入 mapstruct ?
    • 答: BeanUtil 使用的是反射读写数据,mapstruct 是在编译阶段调用对象的 getter/setter 方法生成对应的复制方法,性能后者更优;能不用反射就不要用反射