框架建设实战3——创建框架基础组件frame-base

发布于:2024-12-07 ⋅ 阅读:(33) ⋅ 点赞:(0)

frame-base 顾名思义,就是定义一些基础的类。便于框架进行规约。

主要有(不限于)如下几点:

1.接口基类

public class BaseController {

    /**
     * 接口标准响应
     * @param codeDetail 错误码编码
     * @param message  错误码描述
     * @param data
     * @return
     * @param <T>
     */
    public <T> ResponseData<T> responseData(String codeDetail, String message, T data) {
        return new ResponseData(codeDetail, message, data);
    }
}

2.DTO(数据传输对象)基类

/**
 * DTO基类
 */
@Data
public class BaseDTO implements Serializable {

    private static final long serialVersionUID = -23423423423L;

}

3.分页的出入参

入参:

/**
 * 标准分页查询入参
 */
@Data
@Builder
public class PageRequestDTO extends BaseDTO {

    /**
     * 第几页
     */
    private Integer pageIndex;

    /**
     * 每页记录数目
     */
    private Integer pageSize;

}

出参:

@Builder
@Data
public class PageResponseDTO<T> extends BaseDTO {
    
    /**
     * 当前第几页
     */
    private Integer pageIndex;

    /**
     * 每页记录数
     */
    private Integer pageSize;

    /**
     * 记录总数
     */
    private Integer count;
    
    /**
     * 具体数据记录list
     */
    private List<T> dataList;
    
}

4.接口返回的响应体

@Builder
@Data
public class ResponseData<DTO> extends BaseDTO {

/**
* 响应码
*/
private String code;

/**
* 响应描述
*/
private String msg;

/**
* 真实业务数据
*/
private DTO data;
}

5.异常基类

基本异常基类:

/**
 * 运行时异常基类
 */
public class BaseRuntimeException extends RuntimeException {

    protected String code;
    protected String msg;

    public BaseRuntimeException(String message, Throwable cause) {
        super(message, cause);
        this.msg = message;
    }

    public BaseRuntimeException(String code, String message) {
        super(message);
        this.code = code;
        this.msg = message;
    }
}

业务异常基类:

/**
 * 基本业务异常,所有业务异常都基于此,便于框架的统一异常处理
 */
public class BaseBusinessException extends BaseRuntimeException {

    public BaseBusinessException(String message, Throwable cause) {
        super(message, cause);
    }

    public BaseBusinessException(String code, String message) {
        super(code,message);
    }
}

当然,我们可以扩展不同的异常类型,比如业务校验异常、警告类异常等……

6.统一异常处理

/**
 * 全局异常处理
 */
@ResponseBody
@ControllerAdvice
public class GlobalExceptionHandler {
    
    private static String DEFAULT_ERROR_CODE = "500";
    private static String DEFAULT_ERROR_MSG = "未知异常";

    @ExceptionHandler
    public ResponseData handler(BaseBusinessException e) {
        return ResponseData.builder().code(e.getCode()).msg(e.getMsg()).build();
    }
    @ExceptionHandler
    public ResponseData handler(BaseRuntimeException e) {
        return ResponseData.builder().code(e.getCode()).msg(e.getMsg()).build();
    }

    /**
     * 兜底处理
     * @param e
     * @return
     */
    @ExceptionHandler
    public ResponseData handler(Throwable e) {
        return ResponseData.builder().code(DEFAULT_ERROR_CODE).msg(DEFAULT_ERROR_MSG).build();
    }
}

当然,这些异常处理方法可以根据新的异常类别进行扩展。

以上是web开发常用的基类信息。基本涵盖了一个接口的所有结构。

写在最后

由上述代码可以得知,框架开发就是把共性问题抽出来,然后统一定义和处理。而这个能力表现在:

1.规范

接口规范包含:入参、出参、异常码、异常处理、分页规范、接口基类等。

如此,可以利用框架的能力,对接口进行统一处理。比如,基于AOP等做额外的事情。

2.统一

统一基类,不论是对象基类,还是接口基类,就好比每个程序员的交互语言得到了统一,就好比工程师文化的统一,降低大家的沟通成本。

比如,后端定义了统一的返回体,前端使用接口时候就能标准化处理;定义了统一的异常基类,也便于统一的进行异常处理。

总之,统一规范,也是为了增强框架的统一处理能力。二者相辅相成。