MetaObjectHandler自动填充不生效 踩空日记

企鹅群 398913416

版本

spring.boot  2.2.0
mybatis-plus 3.5.3.1 

配置文件

spring:
  mybatis-plus:
    configuration:
    	meta-object-handler: true

MetaObjectHandler.java

package com.ruoyi.sky.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.sky.context.BaseContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Slf4j
@Component
// 要让 每次新增、更新时自动设置用户信息和时间戳。
public class AutoMyMetaObjectHandler implements MetaObjectHandler {

  @Override
  public void insertFill(MetaObject metaObject) {
    try {
      // 自动填充创建时间
//      this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
      // 自动填充更新时间
      this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
      // 当前用户登录
      Long currentUserId = BaseContext.getCurrentId();
      String currentUserName = BaseContext.getCurrentUserName();
//      log.info("userIdAAAA:{}", currentUserId);
//      log.info("currentUserIdaaaaa:{}", currentUserName);
      if (currentUserId != null) {
        this.strictInsertFill(metaObject, "userId", () -> currentUserId, Long.class);
      }
      if (currentUserName != null) {
        this.strictInsertFill(metaObject, "updateUser", () -> currentUserName, String.class);
      }
    } catch (Exception e) {
      throw e;
    }
  }

  @Override
  public void updateFill(MetaObject metaObject) {
    try {
      log.info("开始更新填充...");
      this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);

      Long currentUserId = BaseContext.getCurrentId();
      String currentUserName = BaseContext.getCurrentUserName();
      log.info("userId:{}", currentUserId);
      log.info("currentUserId:{}", currentUserName);
      if (currentUserId != null) {
        this.strictUpdateFill(metaObject, "userId", () -> currentUserId, Long.class);
      }
      if (currentUserName != null) {
        this.strictUpdateFill(metaObject, "updateUser", () -> currentUserName, String.class);
      }
    } catch (Exception e) {
      throw e;
    }
  }
}

BaseContext.java
这个文件在全局拦截中做处理 通过前端的请求头里面去解析token信息 然后去redis 的key的匹配前端的token 在通过redis去解析 拿到 当前登录用户信息

package com.sky.context;

public class BaseContext {
  // 保存每个请求独立的用户 ID
  private static final ThreadLocal<Long> THREAD_LOCAL_ID = new ThreadLocal<>();
  // 保存每个请求独立的用户名
  private static final ThreadLocal<String> THREAD_LOCAL_USERNAME = new ThreadLocal<>();

  /**
   * 获取当前用户 ID
   */
  public static Long getCurrentId() {
    return THREAD_LOCAL_ID.get();
  }

  /**
   * 设置当前用户 ID
   */
  public static void setCurrentId(Long id) {
    THREAD_LOCAL_ID.set(id);
  }

  /**
   * 获取当前用户名
   */
  public static String getCurrentUserName() {
    return THREAD_LOCAL_USERNAME.get();
  }

  /**
   * 设置当前用户名
   */
  public static void setCurrentUserName(String username) {
    THREAD_LOCAL_USERNAME.set(username);
  }

  /**
   * 清理 ThreadLocal(在拦截器 afterCompletion 中调用)
   */
  public static void remove() {
    THREAD_LOCAL_ID.remove();
    THREAD_LOCAL_USERNAME.remove();
  }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐