Springboot3 ThreadLocal存储公共数据填充

一、创建ThreadLocal类

复制代码
package com.lingyang.system.util.thread;

import com.lingyang.system.data.vo.admin.AdminDetailVO;

/**
 * @author **文
 * @Description:
 * @createDate 2024/8/14 16:01
 **/
public class AdminThreadLocal {

    private static ThreadLocal<AdminDetailVO> AdminThreadLocal = new ThreadLocal<>();

    /**
     * 添加当前登录用户方法  在拦截器方法执行前调用设置获取用户
     * @param admin
     */
    public static void addCurrentUser(AdminDetailVO admin){
        AdminThreadLocal.set(admin);
    }

    /**
     * 获取当前登录用户方法
     */
    public static AdminDetailVO getCurrentUser(){
        return AdminThreadLocal.get();
    }

    /**
     * 删除当前登录用户方法  在拦截器方法执行后 移除当前用户对象
     */
    public static void remove(){
        AdminThreadLocal.remove();
    }

}

二、拦截器中进程结束删除ThreadLocal中的数据

复制代码
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion---------------");
        AdminThreadLocal.remove();
    }

三、拦截器中通过token获取用户数据并存储

用普通的用户数据、admin详情实例

四、原数据中填充用户数据

复制代码
package com.lingyang.system.util.mybatisplus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.lingyang.system.data.vo.admin.AdminDetailVO;
import com.lingyang.system.util.thread.AdminThreadLocal;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @author 黑锦鲤
 * @Description:
 * @createDate 2024/7/22 9:44
 **/
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {

        AdminDetailVO currentUser = AdminThreadLocal.getCurrentUser();

        if(currentUser != null){
            this.strictInsertFill(metaObject,"createById", Long.class, currentUser.getId());
            this.strictInsertFill(metaObject,"createBy", String.class, currentUser.getName());
        }

        this.strictInsertFill(metaObject,"createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        AdminDetailVO currentUser = AdminThreadLocal.getCurrentUser();

        if(currentUser != null){
            this.strictUpdateFill(metaObject,"updateById", Long.class, currentUser.getId());
            this.strictUpdateFill(metaObject,"updateBy", String.class, currentUser.getName());
        }

        this.strictUpdateFill(metaObject,"updateTime", LocalDateTime.class, LocalDateTime.now());
    }

}

五、原数据的处理

复制代码
package com.lingyang.system.util.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * @author 黑锦鲤
 * @Description:
 * @createDate 2024/7/22 10:03
 **/
@Data
public class BaseEntity {

    @TableField(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT)
    private Long createById;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.UPDATE)
    private String updateBy;

    @TableField(fill = FieldFill.UPDATE)
    private Long updateById;

    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;

}

数据填充完成

相关推荐
2501_941805933 小时前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
李慕婉学姐3 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力3 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
数据大魔方3 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora4 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
倔强的石头_4 小时前
【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)
数据库
奋进的芋圆5 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin5 小时前
设计模式之桥接模式
java·设计模式·桥接模式
小熊officer5 小时前
Python字符串
开发语言·数据库·python
model20055 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端