当前位置: 首页 > article >正文

公共字段自动填充-@TableField的fill实现(2)

TheadLocal

客户端发送的每次http请求,在服务端都会分配新的线程。因此登录检查过滤器、controller、元数据对象处理器属于一个线程。

TheadLocal是线程的局部变量:

TheadLocal常用方法:

如何在元数据对象处理器中获取当前登录用户的id?

因为登录检查过滤器、controller、元数据对象处理器属于一个线程,所以可以在filter中获取登录用户的id,set到ThreadLocal中,在元数据处理器中get到线程局部变量ThreadLocal的值。

代码实现:

第一步,实体类注解:

   

    @TableField(fill = FieldFill.INSERT) //插入时填充字段
    private LocalDateTime createTime;
 
    @TableField(fill = FieldFill.INSERT_UPDATE) //插入和更新时填充字段
    private LocalDateTime updateTime;
 
    @TableField(fill = FieldFill.INSERT) //插入时填充字段
    private Long createUser;
 
    @TableField(fill = FieldFill.INSERT_UPDATE) //插入和更新时填充字段
    private Long updateUser;

第二步,封装基于ThreadLocal的工具类

在common包下:

/**
 * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
 */
public class BaseContext {
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
 
    /**
     * 设置值
     * @param id
     */
    public static void setCurrentId(Long id){
        threadLocal.set(id);
    }
 
    /**
     * 获取值
     * @return
     */
    public static Long getCurrentId(){
        return threadLocal.get();
    }
}

第三步,登录检查过滤器把id加到ThreadLocal

 

        //4、判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
            log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
            //这里要强转,虽然request.getSession().getAttribute("employee")类型确实是Long
            Long empId = (Long) request.getSession().getAttribute("employee");
            BaseContext.setCurrentId(empId);
 
            filterChain.doFilter(request,response);
            return;
        }

第四步,自定义元数据对象处理器,获取ThreadLocal的id

在common包下:

/**
 * 自定义元数据对象处理器
 */
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入操作,自动填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        log.info(metaObject.toString());
        //第一个参数属性名,第二个参数自动填充的值
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("createUser",BaseContext.getCurrentId());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
 
    /**
     * 更新操作,自动填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        log.info(metaObject.toString());
 
        long id = Thread.currentThread().getId();
        log.info("线程id为:{}",id);
 
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",BaseContext.getCurrentId());
    }
}

第五步,删除之前写的创建、更新时间等相关代码,让其自动填充


http://www.kler.cn/a/133400.html

相关文章:

  • 【C语言】实现二维数组按列排序
  • python os.path.basename(获取路径中的文件名部分) 详解
  • Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
  • Exploring Defeasible Reasoning in Large Language Models: A Chain-of-Thought A
  • Elasticsearch集群和Kibana部署流程
  • ABAP开发学习——ST05 ABAP SQL跟踪工具
  • Qt/C++ 获取QProcess启动的第三方软件的窗体标题
  • 「Verilog学习笔记」根据状态转移表实现时序电路
  • Linux_安装docker
  • TS的函数如何定义类型
  • 【手写数据库toadb】SQL解析器的实现架构,create table/insert 多values语句的解析树生成流程和输出结构分析
  • 如何将vscode和Linux远程链接:
  • 节点导纳矩阵
  • redis命令记录
  • 【cpolar】Ubuntu本地快速搭建web小游戏网站,公网用户远程访问
  • 【开源】基于JAVA的大学兼职教师管理系统
  • 037、目标检测-SSD实现
  • Flume学习笔记(4)—— Flume数据流监控
  • 酷柚易汛ERP - 序列号盘点操作指南
  • YOLOv7独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度
  • 关于爬虫中的hook(defineProperty,hook cookies, hook载荷数据,hookXHR)
  • 数字IC前端学习笔记:异步复位,同步释放
  • 「项目阅读系列」go-gin-example star 6.5k!(1)
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 2》(6)
  • 解决React遍历每次渲染多个根元素导致无法为元素赋值key的问题
  • 使用Spark SQL读取阿里云OSS的数据