Skip to content

common-framework-core 核心模块详解

模块路径: wemirr-platform-framework/common-framework-core 包路径: com.wemirr.framework.commons

概述

common-framework-core 是整个框架的基础核心模块,提供了:

  • 统一响应封装 Result
  • 实体基类 Entity / SuperEntity
  • 异常处理 CheckedException
  • 安全上下文 AuthenticationContext
  • 线程上下文 ThreadLocalHolder
  • 各种工具类

目录结构

commons/
├── annotation/           # 注解
│   ├── IgnoreGlobalResponse.java
│   ├── log/AccessLog.java
│   └── remote/
├── concurrent/           # 并发工具
│   ├── AsyncExecutor.java
│   └── ParallelResult.java
├── entity/               # 实体类
│   ├── Result.java       # 统一响应
│   ├── Entity.java       # 基础实体
│   ├── SuperEntity.java  # 增强实体
│   ├── Dict.java         # 字典接口
│   └── validator/        # 验证组
├── exception/            # 异常
│   ├── CheckedException.java
│   └── ValidException.java
├── security/             # 安全
│   ├── AuthenticationContext.java    # 认证上下文接口
│   ├── AuthenticationDetails.java   # 认证详情
│   ├── DataPermission.java           # 数据权限
│   └── DataScopeType.java            # 数据权限类型
├── threadlocal/          # 线程本地存储
│   └── ThreadLocalHolder.java        # 上下文持有器
├── utils/                # 工具类
│   ├── TreeBuildUtils.java
│   ├── StreamUtils.java
│   └── reflect/ReflectUtils.java
├── validation/           # 自定义验证
├── i18n/                 # 国际化
├── remote/               # 远程调用
└── times/                # 时间处理

核心类详解

1. Result - 统一响应封装

文件: Result.java

响应码定义:

常量说明
SUCCESS_CODE200成功
FAIL_CODE-1通用失败
TIMEOUT_CODE-2超时
VALID_EX_CODE-9参数验证异常
OPERATION_EX_CODE-400业务操作异常

使用示例:

java
// 成功响应
return Result.success(data);
return Result.ok(data);
return Result.success("操作成功", data);

// 失败响应
return Result.fail("操作失败");
return Result.fail(400, "参数错误");

// 验证失败
return Result.validFail("用户名不能为空");
return Result.validFail("订单 {0} 不存在", "AP1001");

// Builder模式
Result<User> result = Result.<User>builder()
    .code(200)
    .message("成功")
    .data(user)
    .build();

响应结构:

json
{
  "code": 200,
  "message": "操作成功",
  "successful": true,
  "timestamp": 1712649600000,
  "data": { ... }
}

2. Entity / SuperEntity - 实体基类

文件:

  • Entity.java
  • SuperEntity.java

继承关系:

Entity<T> (基础实体)

SuperEntity<T> (增强实体)

Entity - 基础实体

字段类型说明自动填充
idT主键ID(雪花算法)
createByT创建人IDINSERT
createNameString创建人名称INSERT
createTimeInstant创建时间INSERT

SuperEntity - 增强实体

继承 Entity,额外增加:

字段类型说明自动填充
lastModifyByT最后修改人IDINSERT_UPDATE
lastModifyNameString最后修改人名称INSERT_UPDATE
lastModifyTimeInstant最后修改时间INSERT_UPDATE
deletedBoolean逻辑删除标识INSERT

使用示例:

java
// 简单实体(只需要创建信息)
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends Entity<Long> {
    private String username;
    private String password;
}

// 完整实体(需要修改信息和逻辑删除)
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_order")
public class Order extends SuperEntity<Long> {
    private String orderNo;
    private BigDecimal amount;
}

// 验证组使用
public interface Save extends Default { }
public interface Update extends Default { }

@Data
public class UserDTO extends Entity<Long> {
    @NotNull(message = "用户名不能为空", groups = Save.class)
    private String username;

    @NotNull(message = "ID不能为空", groups = Update.class)
    private Long id;
}

3. CheckedException - 业务异常

文件: CheckedException.java

异常类型:

方法HTTP码说明
badRequest(msg)400请求参数错误
notFound(msg)404资源不存在
forbidden(msg)403无权限/登录过期

使用示例:

java
// 基础用法
throw new CheckedException("用户不存在");

// 静态方法
throw CheckedException.badRequest("用户名不能为空");
throw CheckedException.notFound("订单 {0} 不存在", "AP1001");
throw CheckedException.forbidden("登录过期,请重新登录");

// 带状态码
throw CheckedException.badRequest(400, "参数错误");

// 使用Dict枚举
throw CheckedException.badRequest(UserErrorCode.USER_NOT_FOUND);

// 带异常链
throw new CheckedException("操作失败", throwable);

4. ThreadLocalHolder - 线程上下文持有器

文件: ThreadLocalHolder.java

核心特性:

  • 基于 TransmittableThreadLocal 实现
  • 支持跨线程池传递上下文
  • 线程安全的 ConcurrentHashMap 存储

预定义Key:

常量Key说明
KEY_TENANT_IDtenantId租户ID
KEY_USER_IDuserId用户ID
KEY_TRACE_IDtraceId追踪ID
KEY_LOCALElocale语言环境
KEY_USER_INFOuserInfo用户信息

使用示例:

java
// 设置上下文
ThreadLocalHolder.setTenantId(1L);
ThreadLocalHolder.setUserId(100L);
ThreadLocalHolder.set("customKey", "customValue");

// 获取上下文
Long tenantId = ThreadLocalHolder.getTenantId();
Long userId = ThreadLocalHolder.getUserId();
String value = ThreadLocalHolder.getString("customKey");

// 懒加载(只计算一次)
Object data = ThreadLocalHolder.get("expensive", () -> computeExpensiveValue());

// 条件缓存(仅当结果非null时缓存)
Object result = ThreadLocalHolder.get("key", () -> mayReturnNull(), Objects::nonNull);

// 快照与恢复
Map<String, Object> snapshot = ThreadLocalHolder.snapshot();
executor.submit(() -> {
    ThreadLocalHolder.restore(snapshot);
    // 子线程可以获取主线程的上下文
});

// 请求结束时清理(在Filter/Interceptor中)
ThreadLocalHolder.clear();

// 临时切换上下文执行
ThreadLocalHolder.runWith(otherContext, () -> {
    // 在指定上下文中执行
});

5. AuthenticationContext - 认证上下文

文件: AuthenticationContext.java

接口方法:

java
public interface AuthenticationContext {
    // 租户信息
    String tenantCode();           // 租户编码
    Long tenantId();               // 租户ID
    String tenantName();           // 租户名称

    // 用户信息
    Long userId();                 // 用户ID
    String nickname();             // 用户昵称
    String mobile();               // 手机号

    // 认证信息
    String clientId();             // 客户端ID
    UserType userType();           // 用户类型
    boolean anonymous();           // 是否匿名

    // 权限信息
    List<String> funcPermissionList();    // 功能权限
    List<String> rolePermissionList();    // 角色权限
    DataPermission dataPermission();      // 数据权限
}

使用场景: 在业务代码中通过实现此接口获取当前登录用户信息,通常配合 ThreadLocalHolder 使用。


数据权限设计

核心类:

  • DataPermission - 数据权限范围
  • DataScopeType - 数据权限类型枚举
  • DataResourceType - 数据资源类型

数据权限类型:

java
public enum DataScopeType {
    ALL,           // 全部数据
    CUSTOM,        // 自定义数据
    DEPT,          // 本部门数据
    DEPT_AND_SUB,  // 本部门及子部门数据
    SELF           // 仅本人数据
}

工具类

类名功能
JacksonUtilsJSON序列化/反序列化
BeanUtilPlusBean拷贝增强
TreeBuildUtils树形结构构建
StreamUtilsStream流工具
ReflectUtils反射工具
DigestUtil摘要/加密工具
MapHelperMap操作工具
MvelHelperMVEL表达式引擎
AreaUtils / RegionUtils地区工具

注解

注解位置说明
@IgnoreGlobalResponse方法/类忽略全局响应包装
@AccessLog方法访问日志记录
@Remote方法远程调用标记
@RemoteResult方法远程调用结果

自定义验证注解

注解功能
@Name名称验证(自定义规则)
@DateTime日期时间验证

验证组:

  • Save - 新增验证组
  • Update - 更新验证组
  • LessGroup - 精简验证组

学习建议

  1. 先掌握核心类: Result → Entity/SuperEntity → CheckedException
  2. 理解上下文机制: ThreadLocalHolder 是理解整个框架多租户、权限控制的关键
  3. 实践:
    • 创建实体继承 EntitySuperEntity
    • 使用 Result 封装接口返回
    • 使用 CheckedException 抛出业务异常
    • 使用 ThreadLocalHolder 存储请求上下文

下一步学习

  • common-spring-boot-starter - 基于 core 的 Spring Boot 自动配置
  • db-spring-boot-starter - 数据库增强
  • security-spring-boot-starter - 安全认证